點擊這里可以跳轉至
【1】矩陣匯總:http://www.cnblogs.com/HongYi-Liang/p/7287369.html
【2】矩陣生成:http://www.cnblogs.com/HongYi-Liang/p/7275278.html
【3】矩陣加減:http://www.cnblogs.com/HongYi-Liang/p/7287403.html
【4】矩陣點乘:現在的位置
【5】矩陣化簡:http://www.cnblogs.com/HongYi-Liang/p/7464850.html
...
C++語言:
原理解析:
矩陣乘法分為點乘和叉乘,其計算方法不同,本小結介紹點乘。A點乘B,是利用 A的每一行 乘以 B每一列得到新的一組值。
(此處補動圖)
我們首先要有把一行或一列提取出來的成員函數:(請展開查看)
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列;
以下兩種寫法都是上述思路
方法一
- 合法性
- 提取A矩陣的第一行,提取B矩陣的第一列,(它們長度一樣);
- A和B對應的元素分別相乘后相加,作為結果的第一個元素,如此類推重復23步;

方法二(推薦)
- 合法性
- 從二維向量中找到對應的元素相乘后相加,作為結果的對應元素
對於方法一,省略了提取行列的過程二,而通過直接操作二維向量(數組)的元素相乘后相加,更快、占用內存更低。
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; }