smartZhou


私信TA

用户名:smartZhou

访问量:11801

签 名:

刚注册不到一个月,多多关照!

等  级
排  名 81
经  验 4619
参赛次数 1
文章发表 98
年  龄 0
在职情况
学  校 T S university
专  业 计算机科学与技术

  自我简介:

解题思路:
矩阵A的M次幂的两种情况:

一. 幂M为0 
结果为单位矩阵。

何为单位矩阵,维基百科讲解的非常好:

https://zh.wikipedia.org/wiki/%E5%96%AE%E4%BD%8D%E7%9F%A9%E9%99%A3


二. 幂不为0

按照题意,矩阵A的M次幂就是A自己和自己相乘了M次,

A X A = Result  ......

这其中得多次借用临时矩阵存储,类似两数交换借助第三个变量

由于矩阵阶数小于30,那么咱们来定义3个矩阵:

a[30][30]   b[30][30]  c[30][30]

a x b = c   b矩阵中存放a矩阵最原始的值, 最终结果放在c矩阵中。

下一次相乘时,要把c矩阵中的值全部拷贝到a矩阵,

a = c 

再执行 a X b = c时,这里面的a是上一次矩阵相乘的结果



算法就是  a  x b =c  结果存在c 中  再a=c 把结果传给a   再 a x b就是上一次的结果(已赋给a)再乘以a最原始的(b矩阵),不断进行下去

................


 注意事项:

线性代数学的有好长时间了,很多知识点容易淡忘。

开始我以为矩阵的幂就是矩阵内部数的幂。

1   2      的 2次幂为  1   4 

3   4                         9   16 

这是一个严重的错误.........

正确理解矩阵乘法参考维基百科:

https://zh.wikipedia.org/wiki/%E7%9F%A9%E9%99%A3%E4%B9%98%E6%B3%95


参考代码:

#include <stdio.h>
#include <math.h>
#include <string.h>
int main()
{
	int a[30][30],b[30][30],c[30][30];
	int N,M;
	scanf("%d%d",&N,&M);
	for(int i=0; i<N; i++)  //给数组 a 赋值 
	{
		for(int j=0; j<N; j++)
		{
			scanf("%d",&a[i][j]);
			b[i][j]=a[i][j]; 	
		}	
	}	
	if(M==0)  //M=0 , N阶矩阵的 0 次幂为单位矩阵 
	{
		for(int i=0; i<N; i++)
		{
			for(int j=0; j<N; j++)
			{
				if(i==j)  a[i][j]=1;  else a[i][j]=0;
				printf("%d ",a[i][j]);		
			}
			printf("\n");
		}
	}
	else   //幂数非0的情况 
	{
		for(int i=1; i<M; i++)   //此层循环控制 m次幂 
		{
			memset(c,0,sizeof(c));
			for(int x=0; x<N; x++)     
			{
				for(int y=0; y<N; y++)
				{
					for(int z=0; z<N; z++)
						{
						c[x][y] += a[x][z]*b[z][y];
					}
				}
			}	
			for(int i=0; i<N; i++)
			{
				for(int j=0; j<N; j++)
				{
					a[i][j] = c[i][j];
				}
			}
		}
		for(int i=0; i<N; i++)
		{
			for(int j=0; j<N; j++)
			{
				printf("%d ",c[i][j]);
			}
			putchar('\n');
		}
	}
	return 0;
}


 

0.0分

1 人评分

C语言网提供「C语言、C++、算法竞赛」在线课程,全部由资深研发工程师或ACM金牌大佬亲授课,更科学、全面的课程体系,以在线视频+在线评测的学习模式学习,学练同步,拒绝理论派,真正学会编程!还有奖学金等增值福利等你!

  评论区