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

原理解析:

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

(此处补动图)

C++语言:

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

    bool getSpecifiedRow(int index,vector<T> *vec);      //获取第index行元素
    bool getSpecifiedColumn(int index,vector<T> *vec);//获取第index列元素

获取行:

获取列:

接下来开始进行点乘:

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

C语言:

时间: 2024-10-18 22:21:01

线性代数-矩阵-点乘 C和C++的实现的相关文章

[线性代数] 矩阵白化

[线性代数] 矩阵白化 2013-11-25 22:17:22 kuang_liu 阅读数 3735 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/kuang_liu/article/details/16951461 给一个任意矩阵 X,一般情况下它的协方差矩阵并不是对角矩阵.矩阵白化就是用一个白化矩阵 A,使 Y = A * X 的协方差矩阵转化为对角矩阵. 这里首先指出 Y = A

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

矩阵的知识点之多足以写成一本线性代数. 所以我们把矩阵封装成类.以C++为主进行详解. C++语言 分段详解: 基本成员: 矩阵类的成员变量我们使用三个: 矩阵的行数 矩阵的列数 用二维数组(向量)存放矩阵中的所有元素 int m_iRows; int m_iColumns; vector<vector<T>> m_vecMatrix; 矩阵中的基本成员函数包括 加入一行 加入一列 bool addOneRowToBack(vector<T> &vec); //

线性代数——矩阵与矩阵乘法

在刚接触线性代数时,最先学到的是行列式,随之而来的就是矩阵.矩阵的出现过于突兀,当初学习时完全不清楚它的概念,更不要说还有矩阵乘法等各种奇怪的算术操作.于是从网上学习了各种矩阵概念,受益良多,在此总结一下学到的概念. 一.矩阵 矩阵最早来自于方程组的系数及常数所构成的方阵.——百度百科 如此看来,矩阵和行列式还是有联系的,矩阵最初可能就是用来表示行列式用的 方程组 改写成矩阵的形式 然而矩阵的作用不仅限于此,它有着线性变换的作用,我们将通过分析矩阵乘法来详加解释 二.矩阵乘法 提起矩阵乘法,我们

线性代数——矩阵乘法(续)

之前提到过,矩阵乘法可以视作对向量基底的改变,而基底的选取可能直接导致向量维度的改变.一个2*3矩阵可以把二维向量映射到三维空间,故矩阵可以被视作操控空间的一种手段. 矩阵改变了向量维度 为弄懂这种变换的具体性质,我们必须从矩阵本身开始分析.依照之前的思路,矩阵的各列是基底向量,矩阵的右乘就是对列向量的线性组合,同理,矩阵左乘可以看作是对矩阵行向量的线性组合,所以矩阵的列构成了列空间,行构成了行空间.经线性变换后,若有T(x)=0 亦即 Ax=0, 则称 x 在A的零空间N(A)中. 我们用秩来

线性代数-矩阵-加减 C和C++实现

原理解析: (此处补图) 本节编写矩阵的加法和减法,两个矩阵相加,即把两个相同大小的矩阵对应的元素分别相加 .两个矩阵相减,把两个相同大小矩阵的对应元素分别相减. C++语言: 矩阵加法: 首先需要判断矩阵是否行列数相等,在计算中,由于存放矩阵m_vecMatrix我们使用的是二维vector,所以我们需要: 判断合法性 把两个矩阵的第i行元素提取出来 把两个矩阵中此行的第j个元素提取并相加,推入一个临时向量tempVec中, 通过addOneRowToBack()函数将tempVec加入目标向

线性代数-矩阵-【5】矩阵化简 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]矩阵点乘:http://www.cnblogs.com/HongYi-Liang/p/7287324.html [5]矩

线性代数-矩阵-转置 C和C++的实现

原理解析: 本节介绍矩阵的转置.矩阵的转置即将矩阵的行和列元素调换,即原来第二行第一列(用C21表示,后同)与第一行第二列(C12)元素调换位置,原来c31与C13调换.即cij与cji调换 . (此处补图说明) C++语言: 首先我们想到的是把第i行第j列取出来与第j行第i列调换,这种思路很简单就不多说了. 这里提供另一个思路,对整行整列进行操作,方法如下: 使用getSpecifiedRow()把本矩阵中的第i行取出来放在向量tempVec中: 使用 addOneColumToBack()把

线性代数矩阵知识

补充一些数学知识: 首先AB相似:P-1*A*P=B,   AB合同:CT*A*C=B, 二次型:系数在K中的一个n元二次多项式.由其生成的矩阵称为二次型的矩阵,二次型的矩阵一定是对称矩阵! 正定矩阵:实二次型xT*A*x > 0, x为列向量. 性质:假设A为正定矩阵 1.正定矩阵特征值全大于0 2.行列式 |A| >0 3.A合同于单位阵E,即存在可逆方阵C, s.t. CT*E*C = A = CT*C, 显然可得A为对称正定 正交矩阵:A*AT=AT*A=E , 性质: 1.A的各行/

Duanxx的数学知识:线性代数 矩阵消元