原理解析:
矩阵乘法分为点乘和叉乘,本小结介绍点乘。我们知道A点乘B,是利用 A的每一行 乘以 B每一列得到新的一组值。
(此处补动图)
C++语言:
我们首先要有把一行或一列提取出来的成员函数:(请展开查看)
bool getSpecifiedRow(int index,vector<T> *vec); //获取第index行元素 bool getSpecifiedColumn(int index,vector<T> *vec);//获取第index列元素
获取行:
获取列:
接下来开始进行点乘:
1、对于(MxN)A矩阵乘以 (NxJ)的B得到(M*J)的目标矩阵,要求A矩阵的列数要等于B矩阵的行数才能进行点乘,所以首先要做两个矩阵是否符合要求的判断。
2、对于3*3的矩阵:我们首先提取A矩阵的第一行分别和B矩阵第一二三列相乘 ,得到目标矩阵的第一行提取A矩阵的第二行,分别和B矩阵的第一二三列相乘,得到目标矩阵的第二行...
综上,点乘分为两步:
- 判断两个矩阵的合法性;
- 提取A矩阵的第k行,分别与B矩阵的第i列相乘,得到目标矩阵的第k行第i列;
以下两种写法都是上述思路,第一种更快、占用内存更低,第二种更接近于人的思维(第二种折叠请展开)。
template <typename T> Matrix<T> Matrix<T>::operator*(Matrix<T> &matrix) //运算符重载*重载为点乘 { /*matrix leagality check*/ if(this->m_iColumns != matrix.getRows()) { cout<<"operator*():input ileagal"<<endl; return *this; } /*Caculate point multiply*/ Matrix<T> outputMatrix; vector<T> tempVec; T tempData; for(int j=0;j<m_iRows;j++) { for(int k=0;k<matrix.m_iColumns;k++) { tempData =0; for(int i=0;i<m_iColumns;i++) { tempData += this->m_vecMatrix[j][i] * matrix.m_vecMatrix[i][k]; } tempVec.push_back(tempData); } outputMatrix.addOneRowToBack(tempVec); tempVec.clear(); //clear for next rows adding } return outputMatrix; }
C语言:
时间: 2024-10-18 22:21:01