矩阵相乘- c++

矩阵相乘

今天又是闲来无事的一天,在网上又看到了这道矩阵相乘的题。不知道为什么,可能是高数学太久忘了,就想把这道题写下来。记录一下高数知识。

题目描述
给定一个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

一开始我就懵了,并不知道结果怎么来的。所以查了一下资料。以下是对矩阵相乘的介绍。
设A为 m x p 的矩阵,B为 p x n 的矩阵,那么称 m x n 的矩阵C为矩阵A与B的乘积,记作,其中矩阵C中的第 i 行第 j 列元素可以表示为:

在这图片描述
如下所示:
在这里插入图片描述
以上就是矩阵相乘介绍。主要注意的一点就是相乘结果的第 i 行第 j 列是由原第一个矩阵的第 i 行与原第二个矩阵的第 j 列一一对应相乘所得结果。知道这个思想,就能写出代码了。

c++代码如下

#include<iostream>
#include<cstdio>
using namespace std;
int main()
{
   int N,M;
   int a[31][31],b[31][31],c[31][31];
   cin >> N >> M;
   for(int i = 1; i <= N; i ++)
   {
     for(int j = 1; j <= N; j ++)
     {
       scanf("%d",&a[i][j]);
       b[i][j] = a[i][j];
     } 
   } 
   for(int i = 1; i < M; i ++)
   {
    int j = 1,k = 1;
    while(j <= N)
    {
       int toc = 0;
       for(int m = 1; m <= N; m ++)
         toc += a[j][m] * b[m][k];
       c[j][k] = toc;
       k ++;
       if(k == N + 1)
       {
         j ++;
      k = 1; 
    }
 }
 for(int m = 1; m <= N; m ++)
 for(int n = 1; n <= N; n ++)
 b[m][n] = c[m][n];
   }
   //矩阵的零次方是单位矩阵
   if(M == 0)
   {
    for(int i = 1; i <= N; i ++)
    for(int j = 1; j <= N; j ++)
    {
     if(i == j)
     b[i][j] = 1;
     else
     b[i][j] = 0;
    } 
   }
   for(int i = 1; i <= N; i ++)
   {
    for(int j = 1; j <= N; j ++)
    {
     cout << b[i][j] << " ";
    }
 cout << endl;
   }
   return 0;
} 

知道上面这些后,写出代码并不能全过。是因为题目中出现了矩阵的0次幂,而矩阵的零次幂是单位矩阵,
我又查了下单位矩阵的特点,它们都是对角线坐标为1,其他坐标为0。所以在把这点加入代码,就能通过全部测试点了。

发布了26 篇原创文章 · 获赞 0 · 访问量 1366

猜你喜欢

转载自blog.csdn.net/weixin_43846217/article/details/104068783