设A为的矩阵,B为的矩阵C为矩阵A与B的乘积,记作,其中矩阵C中的第行第列元素可以表示为:
如下所示:
1、当矩阵A的列数(column)等于矩阵B的行数(row)时,A与B可以相乘。
2、矩阵C的行数等于矩阵A的行数,C的列数等于B的列数。
3、乘积C的第m行第n列的元素等于矩阵A的第m行的元素与矩阵B的第n列对应元素乘积之和。
除了上述的矩阵乘法以外,还有其他一些特殊的“乘积”形式被定义在矩阵上,值得注意的是,当提及“矩阵相乘”或者“矩阵乘法”的时候,并不是指代这些特殊的乘积形式,而是定义中所描述的矩阵乘法。在描述这些特殊乘积时,使用这些运算的专用名称和符号来避免表述歧义。
矩阵与矩阵的Hadamard积记作。其元素定义为两个矩阵对应元素的乘积的m×n矩阵。例如,
克罗内克积是两个任意大小的矩阵间的运算,符号记作。克罗内克积也被称为直积或张量积。以德国数学家利奥波德·克罗内克命名。计算过程如下例所示:
C++代码
struct Matrix:vectoru003cvectoru003cintu003e u003e//使用标准容器vector做基类,需#include语句{ Matrix(int x=0,int y=0,int z=0)//初始化,默认为0行0列空矩阵 { assign(x,vectoru003cintu003e(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 u0026m,const Matrix u0026n)//常量引用避免拷贝{ 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),试用矩阵统计这些数据。
甲 | 5 | 2 | 4 |
乙 | 3 | 8 | 2 |
丙 | 6 | 0 | 4 |
丁 | 0 | 1 | 6 |
可用下述矩阵描述,其中四行分别表示甲乙丙丁四个工厂的生产情况,三列分布表示三种产品P1,P2,P3的产量。
再设矩阵,其中第一列表示三种产品的单件利润,第二列表示三种产品的单件体积。
矩阵C的第一列数据分别表示四个工厂的利润,第二列分别表示四个工厂产品需要的存储空间。
给定一个有向图,问从A点恰好走k步(允许重复经过边)到达B点的方案数。
把给定的图转为邻接矩阵,即当且仅当存在一条边。令,那么,实际上就等于从点i到点j恰好经过2条边的路径数(枚举k为中转点)。类似地,的第i行第j列就表示从i到j经过3条边的路径数。同理,如果要求经过k步的路径数,我们只需要二分求出即可。
本文发布于:2022-11-16 19:23:46,感谢您对本站的认可!
本文链接:http://www.wtabcd.cn/fanwen/fan/78/495278.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |