矩阵乘以其矩阵转置

在推导公式和计算中,常常能碰到矩阵乘以其矩阵转置,在此做个总结。

1.假设矩阵A是一个 m ∗ n m*n mn 矩阵,那么
A ∗ A T A*A^T AAT 得到一个 m ∗ m m*m mm 矩阵, A T ∗ A A^T*A ATA 得到一个 n ∗ n n*n nn 的矩阵,这样我们就能得到一个方矩阵。
看一个例子:

X θ = H X \theta =H Xθ=H 求解 θ \theta θ.
X T X θ = X T H X^TX\theta =X^TH XTXθ=XTH 这个矩阵X我们不能确定是否是方矩阵,所以我们在其左侧同时乘以X矩阵的转置,这样 就在 θ \theta θ 的左侧得到一个方矩阵。
( X T X ) − 1 X T X θ = ( X T X ) − 1 X T H (X^TX)^{-1}X^TX\theta =(X^TX)^{-1}X^TH (XTX)1XTXθ=(XTX)1XTH 再在等式的两边乘以 X T X X^TX XTX的逆,就变成了单位矩阵 I I I θ \theta θ相乘,这样我们就得到了 θ \theta θ的解:
θ = ( X T X ) − 1 X T H \theta=(X^TX)^{-1}X^TH θ=(XTX)1XTH

2.对称矩阵
如果方阵A满足 A T = A A^T=A AT=A,就称A为对称矩阵。
假设 A = X T X A=X^TX A=XTX,A的转置 A T = ( X T X ) T = X T X = A A^T=(X^TX)^T=X^TX=A AT=(XTX)T=XTX=A,所以我们可以说 ( X T X ) (X^TX) (XTX)是一个对称矩阵。对称矩阵的特征向量两两正交。 1

3.奇异值分解(SVD)
我们可以用与A相关的特征分解来解释A的奇异值分解。A的左奇异向量是 A A T AA^T AAT的特征向量,A的右奇异向量是 A T A A^TA ATA的特征向量,A的非零奇异值是 A T A A^TA ATA特征值的平方根,同时也是 A A T AA^T AAT特征值的平方根。 2

Reference:


  1. https://blog.csdn.net/BingeCuiLab/article/details/47209037 ↩︎

  2. Goodfellow I, Bengio Y, Courville A, et al. Deep learning[M]. Cambridge: MIT press, 2016. ↩︎

  • 35
    点赞
  • 90
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
实现有两个类 CVector 存放数据的自定义动态数组,采用一维动态数组存储矩阵数据 CMatrix 实现的矩阵类 使用的时候包含#include "Matrix.h"就行 CMatrix的接口函数都在"Matrix.h"里面 CVector的接口函数在"Vector.h"里,"Matrix.h"里包含了"Vector.h" 具体用法与测试用例Main.cpp里有3个测试用例,分别是针对构造函数属性计算与运算符重载的 内已包含测试工程xp\vc6.0\上亲测通过,并经过BoundsChecker测试没有内存泄漏。有兴趣的童鞋可以下作参考。 注意: 1、下标都是从0开始,数学课上矩阵下标都是从1开始,但是工作后习惯0开始,矩阵M的第一个元素是M(0,0) 2、类型定死为double,原来作业是模板类,由于vc6对模版支持不好,另矩阵计算double类比较理想、整型几乎只能作加减 提供了多种初始化方式,int[]、float[]、double[]均可构造初始化,或则先构造出CVector再由CVector初始化。 3、定义了一个最大允许误差#define permit_eof (1.0e-13),判断相等使用宏 #define EQUAL(a,b) ( ((b) - (a) < permit_eof)&&((a) - (b) < permit_eof) ? (TRUE) : (FALSE) ) 正常输出的时候绝对值小于permit_eof 的时候清零处理,想要指定精度输出请用PrintOut 鸣谢:CSDN上supermegaboy君的C/C++左值性精髓,读后略有所感,空闲时重构了下大学时的作业,着重区分了函数返回值的左右值 =================================================附录:接口函数========================================================================== 开放的接口: CVector //构造函数 CVector(); virtual ~CVector(); CVector(const size_t &nSize;); CVector(const CVector & vIn);//拷贝构造函数 CVector(const double* const pData,const size_t &nSize;); CVector(const float* const pData,const size_t &nSize;); CVector(const int* const pData,const size_t &nSize;); //公开的成员函数 double at(const size_t& uIndex)const;//作右值 BOOL push_back(const double& dbIn ); BOOL resize(const size_t& nSize); size_t size()const; //重载操作符 double& operator()(const UINT& uIndex);//重载()运算符,可作左值 //重载的运算符 double& operator()(const size_t& xr,const size_t& xc);//重载()运算符,可作左值 CVector& operator=(const CVector &);//重载=运算符 double operator*(const CVector & )const;//重载*运算符,两向量相乘 CVector operator*(const double α)const;//重载*运算符,向量乘以实数alpha CVector& operator*=(const double α);//重载*=算符,向量乘以实数alpha CVector operator+(const CVector & )const;//重载+运算符,向量加上向量 CVector& operator+=(const CVector & );//重载+=算符,向量加上向量 CVector operator-(const CVector & )const;//重载+运算符,向量加上向量 CVector& operator-=(const CVector & );//重载+=算符,向量加上向量 CVector operator+(const double α)const;//重载+运算符,向量加上实数alpna CVector& operator+

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

烤粽子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值