本词条由“科普中国”科学百科词条编写与应用工作项目 审核 。 定义 设A为 的矩阵,B为 的矩阵,那么称 的矩阵C为矩阵A与B的乘积,记作 ,其中矩阵C中的第 行第 列元素可以表示为: [1] 如下所示: 注意事项 1、当矩阵A的列数(column)等于矩阵B的行数(row)时,A与B可以相乘。 2、矩阵C的行数等于矩阵A的行数,C的列数等于B的列数。 3、乘积C的第m行第n列的元素等于矩阵A的第m行的元素与矩阵B的第n列对应元素乘积之和。 基本性质 乘法结合律: (AB)C=A(BC). [3] 乘法左分配律:(A+B)C=AC+BC [3] 乘法右分配律:C(A+B)=CA+CB [3] 对数乘的结合性k(AB)=(kA)B=A(kB). 转置 (AB)T=BTAT. 矩阵乘法在以下两种情况下满足交换律。 AA*=A*A,A和伴随矩阵相乘满足交换律。 AE=EA,A和单位矩阵或数量矩阵满足交换律。 其他的乘积形式 除了上述的矩阵乘法以外,还有其他一些特殊的“乘积”形式被定义在矩阵上,值得注意的是,当提及“矩阵相乘”或者“矩阵乘法”的时候,并不是指代这些特殊的乘积形式,而是定义中所描述的矩阵乘法。在描述这些特殊乘积时,使用这些运算的专用名称和符号来避免表述歧义。 哈达马积(Hadamard product) 矩阵 与 矩阵 的Hadamard积记作 。其元素定义为两个矩阵对应元素的乘积 的m×n矩阵 [3] 。例如, 克罗内克积(Kronecker Product) 克罗内克积是两个任意大小的矩阵间的运算,符号记作 。克罗内克积也被称为直积或张量积.以德国数学家利奥波德·克罗内克命名 [4] 。计算过程如下例所示: 实现 C++代码 struct Matrix:vector >//使用标准容器vector做基类,需#include语句 { Matrix(int x=0,int y=0,int z=0)//初始化,默认为0行0列空矩阵 { assign(x,vector(y,z)); } int h_size()const//常量说明不可省,否则编译无法通过 { return size(); } int l_size()const { return empty()?0:front().size();//列数要考虑空矩阵的情况 } Matrix pow(int k);//矩阵的k次幂,用快速幂实现,k为0时返回此矩阵的单位矩阵 }; Matrix operator*(const Matrix &m,const Matrix &n)//常量引用避免拷贝 { if(m.l_size()!=n.h_size())return Matrix();//非法运算返回空矩阵 Matrix ans(m.h_size(),n.l_size()); for(int i=0; i!=ans.h_size(); ++i) for(int j=0; j!=ans.l_size(); ++j) for(int k=0; k!=m.l_size(); ++k) ans[i][j]+=m[i][k]*n[k][j]; return ans; } Matrix Matrix::pow(int k) { if(k==0) { Matrix ans(h_size(),h_size()); for(int i=0; i!=ans.h_size(); ++i) ans[i][i]=1; return ans; } if(k==2)return (*this)*(*this); if(k%2)return pow(k-1)*(*this); return pow(k/2).pow(2); } 实际应用 数据统计 某公司有四个工厂,分布在不同地区,同时三种产品,产量(单位;t),试用矩阵统计这些数据。 工厂\产品P1P2P3甲524乙382丙604丁016