线性代数-矩阵-【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列元素
获取行:
获取列:
接下来开始进行点乘:
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步;
方法二(推荐)
- 合法性
- 从二维向量中找到对应的元素相乘后相加,作为结果的对应元素
对于方法一,省略了提取行列的过程二,而通过直接操作二维向量(数组)的元素相乘后相加,更快、占用内存更低。
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语言:
线性代数-矩阵-【4】点乘 C和C++的实现的更多相关文章
- 线性代数-矩阵-【1】矩阵汇总 C和C++的实现
矩阵的知识点之多足以写成一本线性代数. 在C++中,我们把矩阵封装成类.. 程序清单: Matrix.h//未完待续 #ifndef _MATRIX_H #define _MATRIX_H #incl ...
- 线性代数-矩阵-【2】矩阵生成 C和C++实现
矩阵的知识点之多足以写成一本线性代数. 所以我们把矩阵的运算封装成矩阵类.以C++为主进行详解. 点击这里可以跳转至 [1]矩阵汇总:http://www.cnblogs.com/HongYi-Lia ...
- 线性代数-矩阵-【5】矩阵化简 C和C++实现
点击这里可以跳转至 [1]矩阵汇总:http://www.cnblogs.com/HongYi-Liang/p/7287369.html [2]矩阵生成:http://www.cnblogs.com/ ...
- 线性代数-矩阵-【3】矩阵加减 C和C++实现
点击这里可以跳转至 [1]矩阵汇总:http://www.cnblogs.com/HongYi-Liang/p/7287369.html [2]矩阵生成:http://www.cnblogs.com/ ...
- 线性代数-矩阵-转置 C和C++的实现
原理解析: 本节介绍矩阵的转置.矩阵的转置即将矩阵的行和列元素调换,即原来第二行第一列(用C21表示,后同)与第一行第二列(C12)元素调换位置,原来c31与C13调换.即cij与cji调换 . (此 ...
- Python之Numpy:线性代数/矩阵运算
当你知道工具的用处,理论与工具如何结合的时候,通常会加速咱们对两者的学习效率. 零 numpy 那么,Numpy是什么? NumPy(Numerical Python) 是 Python 语言的一个扩 ...
- 《利用Python进行数据分析: Python for Data Analysis 》学习随笔
NoteBook of <Data Analysis with Python> 3.IPython基础 Tab自动补齐 变量名 变量方法 路径 解释 ?解释, ??显示函数源码 ?搜索命名 ...
- SymPy库常用函数
简介 SymPy是一个符号计算的Python库.它的目标是成为一个全功能的计算机代数系统,同时保持代码简 洁.易于理解和扩展.它完全由Python写成,不依赖于外部库.SymPy支持符号计算.高精度计 ...
- 一些嵌入式和FPGA相关模块的开源
工作一年,整理下手头做过的东西,分享出来,希望能帮到大家. 嵌入式方面,主要集中在Xilinx家的器件上,ZYNQ居多.Linux相关的就不贴了,网上的资料太多,xilinx-wiki上资料都是比较全 ...
随机推荐
- 51nod_1298:圆与三角形(计算几何)
题目链接 判断圆和三角形是否相交 可以转化为 判断三条线段是否和圆相交 #include<iostream> #include<cstdio> #include< ...
- linux+windows mysql导入导出sql文件
linux下 一.导出数据库用mysqldump命令(注意mysql的安装路径,即此命令的路径):1.导出数据和表结构:mysqldump -u用户名 -p密码 数据库名 > 数据库名.sql# ...
- luogu P2756 飞行员配对方案问题
题目链接:P2756 飞行员配对方案问题 题目描述 英国皇家空军从沦陷国征募了大量外籍飞行员.由皇家空军派出的每一架飞机都需要配备在航行技能和语言上能互相配合的2 名飞行员,其中1 名是英国飞行员,另 ...
- (转)SimpleDateFormat使用
1 SimpleDateFormat public class SimpleDateFormat extends DateFormat SimpleDateFormat 是一个以国别敏感的方式格式化 ...
- Angularjs基础(学习整理)
AngularJS 通过 ng-directives 扩展了 HTML. ng-app 指令定义一个 AngularJS 应用程序. ng-model 指令把元素值(比如输入域的值)绑定到应用程序. ...
- Linux shell for while 循环
1.数字段形式for i in {1..10}do echo $idone 2.详细列出(字符且项数不多)for File in 1 2 3 4 5 do echo $File done ...
- strtok函数 分类: c++ 2014-11-02 15:24 214人阅读 评论(0) 收藏
strtok函数是cstring文件中的函数 strtok函数是cstring文件中的函数 其功能是截断字符串 原型为:char *strtok(char s[],const char *delin) ...
- 高效搭建lnmp环境
1:安装nginx sudo apt-get install nginx 检测 nginx : sudo nginx -t 出现如下表示成功 2:安装配置m ...
- IntelliJ idea学习资源
工作需要, 最近得从Eclipse转战到Idea, 找了些不错的学习资料: 1, 从eclipse上迁移过来的用户说明: https://www.jetbrains.com/help/idea/201 ...
- IoC是什么
IoC是什么 Ioc-Inversion of Control,即"控制反转",不是什么技术,而是一种设计思想.在Java开发中,Ioc意味着将你设计好的对象交给容器控制,而不是传 ...