线性代数-矩阵-【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;
}