线性代数-矩阵-【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上资料都是比较全 ...
随机推荐
- MSDTC启用——分布式事务
一.前言 最近在做一个项目的时候使用了.NET中的System.Transactions(分布式事务),当项目开发完成以后,调用的时候遇到了MSDTC的问题,在查阅了相关资料后将这个问题解决了,大致的 ...
- 2.关于Apache Spark
关于Apache Spark 1 Why Apache Spark 2 关于Apache Spark 3 如何安装Apache Spark 4 Apache Spark的工作原理 5 spark弹性分 ...
- ETL作业调度软件TASKCTL4.1单机部署
单机部署,实际上就是将EM节点和一个Server节点安装到同一个地方.EM节点是TASKCTL服务端的最顶层,主要负责客户端与服务端之间的通信.Server节点是TASKCTL的调度服务控制层,也有A ...
- Android 性能测试——Heap Viewer 工具
Android 性能测试--Heap Viewer 工具 Heap Viewer能做什么? 实时查看App分配的内存大小和空闲内存大小 发现Memory Leaks Heap Viewer使用条件 5 ...
- 【原创】-- C# 点滴积累 -- String
一.string.Format() 将[数字字符串]转为两位小数显示的字符串: dt = dtResult.Select(it => new CommodityPriceLimitEntity ...
- PocScan的搭建与使用
安装Docker, 然后下载镜像 $ sudo curl -sSL https://get.daocloud.io/docker | sh $ sudo systemctl start docker ...
- UICollectionView基本使用详解(OC)
概述 UICollectionView是从iOS6开始引入使用的,目前应用非常广泛,很牛逼!老外的博客也是这么说的(传送门) ## 与UITableView的初步比较 UITableView应该是大家 ...
- Java中synchronized和Lock的区别
synchronized和Lock的区别synchronize锁对象可以是任意对象,由于监视器方法必须要拥有锁对象那么任意对象都可以调用的方法所以将其抽取到Object类中去定义监视器方法这样锁对象和 ...
- 【模板--完全背包】HDU--2602 Bone Collector
Problem Description Many years ago , in Teddy's hometown there was a man who was called "Bone C ...
- akoj-1074-人见人爱A^B
人见人爱A^B Time Limit:1000MS Memory Limit:65536K Total Submit:91 Accepted:55 Description 求A^B的最后三位数表示的 ...