線性代數-矩陣-【4】點乘 C和C++的實現


 點擊這里可以跳轉至

【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列元素

獲取行:

View Code

 

獲取列:

View Code

 

 

接下來開始進行點乘:

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步;
View Code

 

 方法二(推薦)

  •   合法性
  •   從二維向量中找到對應的元素相乘后相加,作為結果的對應元素

  對於方法一,省略了提取行列的過程二,而通過直接操作二維向量(數組)的元素相乘后相加,更快、占用內存更低。

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語言:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM