矩阵操作

矩阵操作(数组)

题目描述

    给定一个N阶初始矩阵,现有以下操作 
    TRANSLATE: 转置,即将aij变为aji,操作结束后输出矩阵 
    ADD: 将该矩阵与一矩阵相加得到一新矩阵,操作结束后输出这一新矩阵 
    MULTIPLY: 与该矩阵与一矩阵相乘得到一新矩阵,操作结束后输出这一新矩阵
    (此处不懂矩阵乘法请自行百度) 
    SUM:输出两条对角线上元素之和(不重复计算)

输入

    测试数据只有一组 
    输入的第一行给出一个整数N(1 <= N <= 5),代表矩阵的阶数
    下N行代表这一矩阵,其数值都是整数 
    其后的每一行都是操作,数据保证输入合法 
    操作以 OVER 结束

输出

    具体输出见样例

样例输入

2
1 0
0 1
TRANSLATE
ADD
1 0
0 1
ADD
2 0
0 2
MULTIPLY
1 2
3 4
SUM
OVER

样例输出

1 0
0 1
2 0
0 2
4 0
0 4
4 8
12 16
40

提示

#include<bits/stdc++.h>
using namespace std;

void ts(int a[][100],int n);
void add(int a[][100],int n);
void mu(int a[][100],int n);
void su(int a[][100],int n);


int main()
{
	int n,i,j,a[100][100];
	char s[20];
	cin>>n;
	for(i=0;i<n;i++)
	{
		for(j=0;j<n;j++)
		{
			cin>>a[i][j];
		}
	}
	while(cin>>s)
	{
		if(s[0]=='T')
			ts(a,n);
		else if(s[0]=='A')
			add(a,n);
		else if(s[0]=='M')
			mu(a,n);
		else if(s[0]=='S')
			su(a,n);
		else if(s[0]=='O')
			break;
	}
	
}

void ts(int a[][100],int n)
{
	int i,j,c[100][100];
	for(i=0;i<n;i++)
	{
		for(j=0;j<n;j++)
		{
			c[i][j]=a[j][i];
			
		}
	}
	for(i=0;i<n;i++)
	{
		for(j=0;j<n;j++)
		{
			a[i][j]=c[i][j];
			
		}
	}
	for(i=0;i<n;i++)
	{
		for(j=0;j<n;j++)
		{
			if(j!=n-1)
				cout<<a[i][j]<<" ";
			else
				cout<<a[i][j]<<"\n";
		}
	}
}

void add(int a[][100],int n)
{
	int i,j,c;
	for(i=0;i<n;i++)
	{
		for(j=0;j<n;j++)
		{
			cin>>c;
			a[i][j]+=c;
		}
	}
	for(i=0;i<n;i++)
	{
		for(j=0;j<n;j++)
		{
			if(j!=n-1)
				cout<<a[i][j]<<" ";
			else
				cout<<a[i][j]<<"\n";
		}
	}
}

void mu(int a[][100],int n)
{
	int i,j,k,sum,b[100][100],c[100][100];
	for(i=0;i<n;i++)
	{
		for(j=0;j<n;j++)
		{
			cin>>b[i][j];
			c[i][j]=a[i][j];
		}
	}
	for(i=0;i<n;i++)
	{
		for(k=0;k<n;k++)
		{
			sum=0;
			for(j=0;j<n;j++)
			{
				sum+=c[i][j]*b[j][k];
			}	
			a[i][k]=sum;
		}	
	}
	for(i=0;i<n;i++)
	{
		for(j=0;j<n;j++)
		{
			if(j!=n-1)
				cout<<a[i][j]<<" ";
			else
				cout<<a[i][j]<<"\n";
		}
	}	
}
void su(int a[][100],int n)
{
	int i,j,s;
	s=0;
	for(i=0;i<n;i++)
	{
		for(j=0;j<n;j++)
		{
			if(j==i)
				s+=a[i][j];
			else if(j==n-1-i)
				s+=a[i][j];		
		}
	}
	cout<<s<<"\n";	
}

思考

乘法是难点
在这里插入图片描述
N阶矩阵的加法,A矩阵第i行的第j(1,2,3…)和B矩阵的第j(1,2,3…)行的第k列分别相乘相加后为结果的第i行,第k列;其中i是最外层循环,k是第二层,j是最里层。
行和列相同的矩阵即可使用这个乘法,但是如果列和行不同,结果的列会按照B的列。
设A为的矩阵,B为的矩阵,那么称的矩阵C为矩阵A与B的乘积,记作 ,其中矩阵C中的第行i第k列元素可以表示为,如下:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
注意事项
编辑
1、当矩阵A的列数(column)等于矩阵B的行数(row)时,A与B可以相乘。
2、矩阵C的行数等于矩阵A的行数,C的列数等于B的列数。
3、乘积C的第m行第n列的元素等于矩阵A的第m行的元素与矩阵B的第n列对应元素乘积之和。

参考来源

矩阵乘法(C实现)
百度百科

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值