矩阵基本运算(C++)
闲着没事,将以前利用C++实现的矩阵各种运算整理了一下,分享一下,矩阵运算包括:
1、二维矩阵创建 6、两矩阵上下叠加
2、两矩阵相加 7、矩阵左右叠加
3、两矩阵相减 8、矩阵转置
4、两矩阵相乘 9、矩阵求逆
5、一个数字与矩阵相乘 10、矩阵打印显示
所有运算都以分块函数的形式展现,有需要的可跳转自取。
由于数据格式为double,因此对于数组中为0的数据并不会主动显示为0,需要设定一个值判断与该大小,小于该值的赋值为0。
const double epsilon=1e-12; //小于该数判断为0
1、利用C++中vector容器创建矩阵(注意该函数会在后面函数中反复调用)
//创建 h行l列的矩阵,并将初始各值设定为0
vector<vector<double>> creatmatrix(int h,int l)
{vector<vector<double>> v;for (int i = 0; i < h; i++){vector<double>v1(l,0);v.push_back(v1);}return v;
}
2、两矩阵相加
//矩阵A+矩阵B=矩阵C,并返回
vector<vector<double>> plus(const vector<vector<double>>&A,const vector<vector<double>>&B)
{int h=A.size();int l=A[0].size();vector<vector<double>> C;C=creatmatrix( h, l);for(int i=0;i<h;i++){for (int j = 0; j < l; j++){C[i][j]=A[i][j]+B[i][j]; if (abs(C[i][j])<epsilon){C[i][j]=0.0;}}}return C;
}
3、两矩阵相减
//矩阵A-矩阵B=矩阵C,并返回
vector<vector<double>> minus(const vector<vector<double>>&A,const vector<vector<double>>&B)
{int h=A.size();int l=A[0].size();vector<vector<double>> C;C=creatmatrix( h, l);for(int i=0;i<h;i++){for (int j = 0; j < l; j++){C[i][j]=A[i][j]-B[i][j]; if (abs(C[i][j])<epsilon){C[i][j]=0.0;}}}return C;
}
4、两矩阵相乘
//矩阵A*矩阵B=矩阵C,并返回
vector<vector<double>> multiply(const vector<vector<double>>&A,const vector<vector<double>>&B)
{int A_h=A.size();int A_l=A[0].size();int B_h=B.size();int B_l=B[0].size();if(A_l !=B_h){cout<<"两矩阵维数无法相乘"<<endl;exit(0);}vector<vector<double>> C=creatmatrix(A_h,B_l);for (int i = 0; i < A_h; i++){for (int j = 0; j < B_l; j++){C[i][j]=0;for (int k = 0; k < A_l; k++){C[i][j] +=A[i][k]*B[k][j];}if (abs(C[i][j])<epsilon){C[i][j]=0.0;}//cout<<C[i][j]<<"\t";}//cout<<endl;}return C;
}
5、一个数字与矩阵相乘
//矩阵A*num=矩阵B,并返回
vector<vector<double>> multiply_num(const vector<vector<double>>&A,double num)
{int A_h=A.size();int A_l=A[0].size();vector<vector<double>> B=creatmatrix(A_h,A_l);for (int i = 0; i < A_h; i++){for (int j = 0; j < A_l; j++){B[i][j]=num*A[i][j];}}return B;
}
6、两矩阵上下叠加
//矩阵A与矩阵B上下叠加获得新的矩阵C,并返回
vector<vector<double>> matrix_overlaying_below(const vector<vector<double>>&A,const vector<vector<double>>&B)
{//判断矩阵的列是否相等int A_h=A.size();int A_l=A[0].size();int B_h=B.size();int B_l=B[0].size();if (A_l != B_l){cout<<"叠加的矩阵列数不相等"<<endl;exit(0);}//创建vector<vector<double>> C=creatmatrix(A_h+B_h,A_l);//将A传入for (int i = 0; i < A_h; i++){for (int j = 0; j < A_l; j++){C[i][j]=A[i][j];}}//将B传入for (int i = 0; i < B_h; i++){for (int j = 0; j < B_l; j++){C[i+A_h][j]=B[i][j];}}return C;
}
7、矩阵左右叠加
//矩阵A与矩阵B左右叠加,获得新的矩阵C,并返回
vector<vector<double>> matrix_overlaying_beside(const vector<vector<double>>&A,const vector<vector<double>>&B)
{//判断矩阵的列是否相等int A_h=A.size();int A_l=A[0].size();int B_h=B.size();int B_l=B[0].size();if (A_h != B_h){cout<<"叠加的矩阵行数不相等"<<endl;exit(0);}//创建vector<vector<double>> C=creatmatrix(A_h,A_l+B_l);//将A传入for (int i = 0; i < A_h; i++){for (int j = 0; j < A_l; j++){C[i][j]=A[i][j];}}//将B传入for (int i = 0; i < B_h; i++){for (int j = 0; j < B_l; j++){C[i][j+A_l]=B[i][j];}}return C;
}
8、矩阵转置
//输入矩阵A,输出矩阵A的转置矩阵AT
vector<vector<double>> trans(const vector<vector<double>> &A)
{vector<vector<double>> AT=creatmatrix(A[0].size(),A.size());int h=AT.size();int l=AT[0].size();for (int i = 0; i <h ; i++){for (int j = 0; j < l; j++){AT[i][j]=A[j][i];}}return AT;
}
9、矩阵求逆
//输入矩阵A,输出矩阵A的逆矩阵inv_A
vector<vector<double>> inverse(const vector<vector<double>> &A)
{if (A.size() != A[0].size()){cout<<"输入矩阵维数不合法"<<endl;exit(0);}int n=A.size();vector<vector<double>> inv_A=creatmatrix(n,n);vector<vector<double>> L=creatmatrix(n,n);vector<vector<double>> U=creatmatrix(n,n);vector<vector<double>> inv_L=creatmatrix(n,n);vector<vector<double>> inv_U=creatmatrix(n,n);
//LU分解//L矩阵对角元素为1for (int i = 0; i < n; i++){L[i][i] = 1; }//U矩阵第一行for (int i = 0; i < n; i++){U[0][i]=A[0][i]; }//L矩阵第一列for (int i = 1; i < n; i++){L[i][0]=1.0*A[i][0]/A[0][0]; }//计算LU上下三角for (int i = 1; i < n; i++){//计算U(i行j列)for (int j = i; j < n; j++){double tem = 0;for (int k = 0; k < i; k++){tem += L[i][k] * U[k][j];}U[i][j] = A[i][j] - tem;if (abs(U[i][j])<epsilon){U[i][j]=0.0;}}//计算L(j行i列)for (int j = i ; j < n; j++){double tem = 0;for (int k = 0; k < i; k++){tem += L[j][k] * U[k][i];}L[j][i] = 1.0*(A[j][i] - tem) / U[i][i];if (abs(L[i][j])<epsilon){L[i][j]=0.0;}}}//L U剩余位置设为0for(int i=0;i<n;i++){for(int j=0;j<n;j++){if(i>j){U[i][j]=0.0;}else if(i<j){L[i][j]=0.0;}}}//LU求逆//求矩阵U的逆 for (int i=0;i<n;i++) {inv_U[i][i]=1/U[i][i];// U对角元素的值,直接取倒数for (int k=i-1;k>=0;k--){double s=0;for (int j=k+1;j<=i;j++){s=s+U[k][j]*inv_U[j][i];}inv_U[k][i]=-s/U[k][k];//迭代计算,按列倒序依次得到每一个值,if (abs(inv_U[k][i])<epsilon){inv_U[k][i]=0.0;}}}//求矩阵L的逆for (int i=0;i<n;i++) {inv_L[i][i]=1; //L对角元素的值,直接取倒数,这里为1for (int k=i+1;k<n;k++){for (int j=i;j<=k-1;j++){inv_L[k][i]=inv_L[k][i]-L[k][j]*inv_L[j][i]; if (abs(inv_L[k][i])<epsilon){inv_L[k][i]=0.0;}}}}inv_A=multiply(inv_U,inv_L);return inv_A;
}
10、矩阵打印显示
void show_matrix(const vector<vector<double>> &A)
{int h=A.size();int l=A[0].size();for (int i = 0; i < h; i++){for (int j = 0; j < l; j++){cout<<A[i][j]<<"\t";}cout<<endl;}
}
矩阵基本运算(C++)相关推荐
- 技术图文:Matlab VS. Numpy 矩阵基本运算
背景 前段时间在知识星球上立了一个Flag,至少写10篇关于 Python,Matlab 和 C# 对比的总结. 这是第 3 篇,对比 Matlab 与 Numpy 在矩阵基本运算方面的区别与联系. ...
- 2.2 矩阵基本运算
矩阵基本运算 矩阵作为有序向量组的整体,可以进行运算,就如同向量作为有序数组的整体.主要运算包括相等,加法和数乘.矩阵运算规则都是根据矩阵乘以向量是矩阵向量组的线性组合推导出来的,即公式(1). 矩阵 ...
- python矩阵运算与线形代数_[译] 线性代数:矩阵基本运算
线性代数:矩阵基本运算 在本文中,我们将介绍矩阵的大部分基本运算,依次是矩阵的加减法.矩阵的标量乘法.矩阵与矩阵的乘法.求转置矩阵,以及深入了解矩阵的行列式运算.本文将不会涉及逆矩阵.矩阵的秩等概念, ...
- OpenCV的各种矩阵基本运算、基本操作及示例代码(加、减、乘、点乘、点除、乘方、开方、累加、转置、比较等)
OpenCV的各种矩阵基本运算.基本操作及示例代码(加.减.乘.点乘.点除.乘方.开方.累加.转置.比较等) OpenCV的各种矩阵基本运算.基本操作及示例代码 目录 01-两个矩阵相加.矩阵和标量相 ...
- MATLAB矩阵基本运算的实现(一)
MATLAB是matrix&laboratory两个词的组合,意为矩阵工厂(矩阵实验室),强大的矩阵运算能力是MATLAB的一个重要的特点,下面我就为大家整理了一下利用MATLAB实现矩阵基本 ...
- python矩阵左除_技术图文:Matlab VS. Numpy 矩阵基本运算
背景 前段时间在知识星球上立了一个Flag,至少写10篇关于 Python,Matlab 和 C# 对比的总结. 这是第 3 篇,对比 Matlab 与 Numpy 在矩阵基本运算方面的区别与联系. ...
- Python 矩阵基本运算【numpy】
文章目录 一.实验说明 二.Python 矩阵基本运算 1. python矩阵操作 2. python矩阵乘法 3. python矩阵转置 4. python求方阵的迹 5. python方阵的行列式 ...
- matlab基本矩阵运算,科学网—matlab中矩阵基本运算 - 成爱芳的博文
以矩阵A为例: (1)转置矩阵求取 AT transpose(A) >> A=[1 0 3; 2:4; 3 1 0] A = 1 0 3 2 3 4 3 ...
- Eigen(4)矩阵基本运算
矩阵和向量的运算 提供一些概述和细节:关于矩阵.向量以及标量的运算. 1. 介绍 Eigen提供了matrix/vector的运算操作,既包括重载了c++的算术运算符+/-/*,也引入了一些特殊的运算 ...
- MATLAB(矩阵基本运算)
矩阵的基本命令和功能 MATLAB命令 功能 效果 A' 矩阵A的转置 A+B 矩阵A和矩阵B的和 A-B 矩阵A减矩阵B A*B 矩阵A乘以矩阵B k*A 数看乘以矩阵A 当k等于3时 det(A) ...
最新文章
- 2022-2028年中国新能源专用车行业市场前瞻与投资战略规划分析报告
- (续)我对09毕业生说两句
- python多维字符数组_python多维数组内找指定字符串
- Star: Ubuntu下配置和编译cpp-ethereum客户端启动GPU加速交易
- 代码之谜(二)- 语句与表达式
- Django中使用极验Geetest滑动验证码
- Jdom的SAXBuilder解析String形式的XML
- CF785E Anton and Permutation
- lia人是什么意思_69年属鸡人终身灾难是什么意思
- vb.net axWindowsMediaPlayer 控件使用
- Splunk数据处理
- php 翻转180度,如何翻转视频—将视频翻转90或180度
- js判断对象上是否含有某个属性
- Windows11在Edge浏览器中打开IE浏览器兼容的页面,在Edge浏览器打开加载ActiveX控件的页面
- 钟表维修管理系统技术解析(六) 录入保修单
- 《编程之道》(转载) 全文
- 39 个奇葩代码注释,看完笑哭了。。。
- 爬取''百思不得姐''网站的全部视频
- Bootstrap3基础 btn-xs/sm... 按钮的四种大小
- 5个步骤做好会议复盘工作
热门文章
- Python编写薅羊毛脚本经验分享
- wireshark 抓包 出现 SSL Continuation Data
- 小麦钱包服务器维护,GitHub - MediShares/scatter-eos-sample: Scatter API 开发示例 by 麦子钱包...
- 高盛表示将放弃建立加密货币交易部门的计划
- 【免费毕设】java+sql企业固定资产管理系统
- 微信公众平台java开发
- 超微板子USB软驱不认问题
- linux上不了网是因为千兆网卡,求救 千兆网卡不能工作在千兆只能百兆 排除网线问题...
- H5互动游戏推荐,适合和产品结合的小游戏
- 多体素模式分析(MVPA)和表征相似性分析(RSA)