【比较易懂的矩阵基本运算代码】 加法 乘法 幂次方 (c++)

一 矩阵加法:

矩阵的加减法很简单,就是对位相加减就行了。

比如 1 2     和 1 2   相加等于 2 4
        3 4          3 4                  6 8

代码:

#include <iostream>
using namespace std;  
typedef long long ll; 
int main()
{
	ll ans[1100][1100]={0}; //记录答案矩阵
 	ll n,m,x;  //n行m列 
 	cin>>n>>m;
 	for(int i=0;i<n;i++)
 	  for(int j=0;j<m;j++)
 	    cin>>ans[i][j];   //直接把第一个矩阵的值保存在ans中
 	    
 	for(int i=0;i<n;i++)
 	{
 		for(int j=0;j<m;j++)
 		{
 			cin>>x;  //第二个矩阵各个位置的值
			cout<<ans[i][j]+x<<" ";  //然后输出第一个加第二个的值
	    }	
	    cout<<endl;
    } 
     return 0;
}

二 矩阵乘法:

矩阵乘法运算规则:(图是百度百科的)
在这里插入图片描述
代码以n*n矩阵 自己乘自己为例
(这种情况应该比较好理解,n*m代码稍作修改就行)

比如 1 2 乘 1 2 等于   1x1+2x3   1x2+2x4 等于 7 10
        3 4      3 4           3x1+4x3   3x2+4x4        15 22

代码:

#include<iostream>
using namespace std;
typedef long long ll;
int main()
{
	int n;  //n*n矩阵
	ll ans[35][10]={0},a[35][10];
	cin>>n;
	for(int i=0;i<n;i++)
	    for(int j=0;j<n;j++)
	    	cin>>a[i][j];	
    
	   for(int i=0;i<n;i++)
	   	  for(int j=0;j<n;j++)
		  	 for(int k=0;k<n;k++)
			   ans[i][j] += a[i][k]*a[k][j];
			  //手写一遍模拟一下就知道k为啥是这样了
	    			  
	for(int i=0;i<n;i++) //输出
	{
		for(int j=0;j<n;j++)
			cout<<ans[i][j]<<" ";
		cout<<endl;
	}
	return 0;
} 

三 矩阵幂次方:

矩阵幂次方就和矩阵乘法很相似,但是ans矩阵要不断更新,用来多次与初始矩阵相乘,代码以n*n矩阵为例
(纸上写一遍,模拟一下这个过程,看代码就更容易理解)

比如 1 2 的 2次幂就是初始矩阵 1 2 先与自身相乘
        3 4                                      3 4

得到 7 10 如果是3次幂那就继续用得到的矩阵乘初始矩阵

        15 22

代码:

#include<iostream>
using namespace std;
typedef long long ll;
int main()
{
	int n,m;  //n阶矩阵 m次方
	ll ans[35][10]={0},a[35][10],temp[35][10]={0};
	//ans存答案矩阵 , a存初始矩阵 , temp存中间计算过程矩阵
	cin>>n>>m;
	for(int i=0;i<n;i++)
	    for(int j=0;j<n;j++)
	    	cin>>a[i][j],ans[i][j]=a[i][j];	
    
    if(m==0)
    //判断0阶 也就是单位矩阵,主对角线为1,其他都是0
    //主对角线:左上角到右下角
    {
    	for(int i=0;i<n;i++)
    	  for(int j=0;j<n;j++)
    	    if(i==j) ans[i][j]=1; //主对角线为1
    	    else ans[i][j]=0;  //其余为0
	}
    else
    {
    	while(--m)  //乘的次数
	  {
	   for(int i=0;i<n;i++)
	   	  for(int j=0;j<n;j++)
		  	 for(int k=0;k<n;k++) 
			   temp[i][j] += ans[i][k]*a[k][j]; 
	//ans*初始矩阵a,结果加到temp矩阵中
	   
	   for(int p=0;p<n;p++)
	   	  for(int q=0;q<n;q++)
		 	ans[p][q]=temp[p][q],temp[p][q]=0;  
	//把临时的矩阵放到ans矩阵中,然后清0(方便下一次计算)  			  
      }  
	}
	for(int i=0;i<n;i++)  //输出
	{
		for(int j=0;j<n;j++)
		{
			cout<<ans[i][j];
			if(j<n-1) cout<<" ";
		}
		cout<<endl;
	}
	return 0;
} 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章