前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >基础练习 矩阵乘法

基础练习 矩阵乘法

作者头像
刘开心_1266679
发布2019-02-14 15:31:27
8350
发布2019-02-14 15:31:27
举报

问题描述

  给定一个N阶矩阵A,输出A的M次幂(M是非负整数)   例如:   A =   1 2   3 4   A的2次幂   7 10   15 22

输入格式

  第一行是一个正整数N、M(1<=N<=30, 0<=M<=5),表示矩阵A的阶数和要求的幂数   接下来N行,每行N个绝对值不超过10的非负整数,描述矩阵A的值

输出格式

  输出共N行,每行N个整数,表示A的M次幂所对应的矩阵。相邻的数之间用一个空格隔开

样例输入

2 2 1 2 3 4

样例输出

7 10 15 22 思路:         由于矩阵都是方阵,所以不需要考虑每次相乘的两个矩阵的顺序,大大降低了题的难度,按照矩阵乘法规则递归调用求解。也可以重载" * ",下面只给出了主要代码。

代码语言:javascript
复制
//#define LOCAL
#include <cstdio>
#include <cstring>
#define MAX_X 30
#define MAX_Y 30

int n, m;
struct Matrix
{
	int x, y;  //角标
	int a[MAX_X][MAX_Y]; //内容 
	void clear()
	{
		x = y = 0;
		memset(a, 0, sizeof(a));
	}
};

void PrintMatrix(Matrix &a, int n)
{
	for(int i = 0; i < n; i++)
	{	
		int first = 1;
		for(int j = 0; j < n; j++)
		{
			if(first)
			{
				printf("%d", a.a[i][j]);
				first = 0;
			}
			else
			{
				printf(" %d", a.a[i][j]);
			}
		}
		printf("\n");
	}
}

Matrix Multiplication(Matrix &a, Matrix &b)   //n:阶数  , count:幂 -1
{
	Matrix tmp;
	tmp.clear();   //初始化矩阵 
	for(int k = 0; k < n; ++k)  //k:积矩阵行
	{
		for(int x = 0; x < n; ++x) 
		{
			for(int y = 0; y < n; ++y)
			{
				tmp.a[k][x] += a.a[k][y] * b.a[y][x];
			}
		}
	} 

	return tmp;
}

int main()
{
#ifdef LOCAL
	freopen("input3.txt", "r", stdin);
	freopen("output.txt", "w", stdout);
#endif
	Matrix a, ans;
	scanf("%d", &n);
	scanf("%d", &m);
	a.x = a.y = n; 
	for(int i = 0; i < a.x; i++)
	{
		for(int j = 0; j < a.y; j++)
		{
			scanf("%d", &a.a[i][j]);
			ans.a[i][j] = a.a[i][j];
		}
	}
	if(m == 0)
	{
		for(int i = 0; i < n; i++)
		{
			for(int j = 0; j < n; j++)
			{
				ans.a[i][j] = (i == j) ? 1 : 0;	
			}	
		}	
	} 
	else
	{
		for(int i = 0; i < m-1; i++)
		{
			ans = Multiplication(ans, a);
		}
	}
	PrintMatrix(ans, n);
	return 0;
}
代码语言:javascript
复制
struct Matrix
{
	int n, m;
	int a[MAXN][MAXM];
	void clear()
	{
		n = m = 0;
		memset(a, 0, sizeof(a));
	}
	Matrix operator * (const Matrix &b) const
	{
		Matrix tmp;
		tmp.clear();
		tmp.n = n;
		tmp.m = b.m;
		for(int i = 0; i < n; ++i)
		{
			for(int j = 0; j< b.m; ++j)
			{
				for(int k = 0; k < m; ++k)
				{
					tmp.a[i][j] += a[i][k] * b.a[k][j];
				}
			}
		}
		return tmp;
	}
};
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2015年03月11日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档