矩阵基本运算(C++)

这篇具有很好参考价值的文章主要介绍了矩阵基本运算(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矩阵对角元素为1
	for (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剩余位置设为0
	for(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对角元素的值,直接取倒数,这里为1
		for (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、矩阵打印显示文章来源地址https://www.toymoban.com/news/detail-406203.html

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++)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C++借助Eigen库实现矩阵开方(开根号)运算

    在matlab中我们可以通过sqrtm()函数实现简单的矩阵开方运算,当使用C++时,可以通过以下函数实现。 1、添加头文件: 2、开方函数: 3、主函数调用 在matlab中我们可以通过sqrtm()函数实现简单的矩阵开方运算,当使用C++时,可以通过以上函数实现。

    2024年02月15日
    浏览(33)
  • C++利用类实现矩阵的数乘、乘法以及点乘

        ----------------------------------矩阵的数乘、乘法、点乘---------------------------------------*    *-description:用户选择运算方式后输入矩阵的规模并赋值,随即进行矩阵相关运算      *- author:Luo                                                                             

    2024年02月06日
    浏览(46)
  • 矩阵的基本概念和运算

    一、矩阵的定义 矩阵是数学中的一种基本工具,它是由一组数值按照一定的行列排列而成的矩形数表。下面我们详细介绍矩阵的定义、表示以及常见的矩阵类型。 1.1 矩阵的概念与表示 矩阵通常用大写字母表示,例如矩阵 A A A 。矩阵中的每个数值称为矩阵的元素,矩阵的行

    2024年02月13日
    浏览(37)
  • python矩阵的基本运算

    先引入numpy,以后的教程中,我们都引用为np作为简写 使用mat函数创建一个2X3矩阵 使用shape获取矩阵大小 使用下标读取矩阵中的元素 进行行业转换 通常情况下,使用二维数组代替矩阵来进行矩阵运算,可见矩阵和数组基本上都可以 加减法同样 当然列表是不能这么尽兴加减的

    2023年04月08日
    浏览(38)
  • python:矩阵的基本运算

    引入  numpy  库 1. python矩阵操作 1)使用  mat  函数创建一个 2X3矩阵  2)使用  shape  可以获取矩阵的大小  3)进行行列转换 4)使用二维数组代替矩阵来进行矩阵运算  5) 加减法 1)使用二维数组创建两个矩阵A和B 2)一个矩阵的数乘,其实就是矩阵的每一个元素乘以该数

    2024年02月03日
    浏览(36)
  • 4.利用matlab符号矩阵的四则运算(matlab程序)

    1. 简述     符号对象的建立 sym函数 sym函数用于建立单个符号对象,其常用调用格式为: 符号对象名=sym(A) 1 将由A来建立符号对象,其中,A可以是一个数值常量、数值矩阵或数值表达式(不加单引号),此时符号对象为一个符号常量;A也可以是一个变量名(加单引号),这时符号对

    2024年02月13日
    浏览(48)
  • 【矩阵的创建与基本运算】——matlab基础

    如果我要创立一个两行两列分别为1 2 3 4 的矩阵该怎么做呢? 用中括号创建,每个元素之间用空格隔开,每行之间用分号隔开即可 第一个参数为行,第二个参数为列。创建一个两行三列元素全为0的矩阵。 第一个参数为行,第二个参数为列。创建一个四行三列元素全为1的矩阵

    2024年02月17日
    浏览(40)
  • matlab使用教程(5)—矩阵定义和基本运算

            本博客介绍如何在 MATLAB 中创建矩阵和执行基本矩阵计算。         MATLAB 环境使用矩阵来表示包含以二维网格排列的实数或复数的变量。更广泛而言,数组为向量、矩阵或更高维度的数值网格。MATLAB 中的所有数组都是矩形,在这种意义上沿任何维度的分量向量

    2024年02月15日
    浏览(31)
  • matlab基础(一):matlab中矩阵的基本运算

            在学习矩阵有关运算的时候要相信自己已经知道了很多线代知识,不然会看不懂的QAQ~  例1:生成一个3阶全1矩阵。 例2:产生一个在区间[5,15]内均匀分布的5阶随机矩阵 例3:产生均值为0.5,方差为0.3的4阶矩阵 例4:生成从10到100间具有5个元素的线性等分向量。 例5:生成

    2024年02月04日
    浏览(43)
  • 4*4 矩阵键盘进行数据的输入及加、减、乘、除基本运算,LED 显示 运算结果。

    一、什么是矩阵键盘 矩阵键盘是单片机外部设备中所使用的排布类似于矩阵的键盘组,由于电路设计时需要更多的外部输入,单独的控制一个按键需要浪费很多的IO资源,所以就有了矩阵键盘,常用的矩阵键盘有4 4和8 8,其中用的最多的是4*4。 二、矩阵键盘的原理 矩阵键盘又

    2024年02月12日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包