首页 > 代码库 > 线性代数-矩阵-点乘 C和C++的实现

线性代数-矩阵-点乘 C和C++的实现

原理解析:

矩阵乘法分为点乘和叉乘,本小结介绍点乘。我们知道A点乘B,是利用 A的每一行 乘以 B每一列得到新的一组值。

(此处补动图)

C++语言:

我们首先要有把一行或一列提取出来的成员函数:(请展开查看)

    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列;

以下两种写法都是上述思路,第一种更快、占用内存更低,第二种更接近于人的思维(第二种折叠请展开)。

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;
}

 

技术分享View Code

 

 

 

C语言:

线性代数-矩阵-点乘 C和C++的实现