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

  • 相关阅读:
    算法: 整数中1出现的次数(从1到n整数中1出现的次数)
    健身:肩部训练
    算法: 字符串的排列
    不能浮躁,还是需要沉淀;
    算法:从上往下打印二叉树
    健身:手臂训练
    抛出错误
    记录错误
    调用栈
    try/except/finally
  • 原文地址:https://www.cnblogs.com/HongYi-Liang/p/7287324.html
Copyright © 2020-2023  润新知