线性代数-矩阵-【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语言:

posted @ 2017-08-04 22:01  HongYi_Liang  阅读(4332)  评论(1编辑  收藏  举报