矩阵乘法----蓝桥杯
程序员文章站
2022-06-12 12:41:52
...
核心就是如何求取两个矩阵的乘法,数学线代中两个矩阵相乘之后的矩阵中c[i][j]是由左边矩阵(矩阵相乘时)的第i行中的所有元素分别与右边矩阵中的第j列中的元素相乘得到的和。c[i][j]+=a[i][jj]*b[jj][j];(核心一步)
AC代码:
#include <stdlib.h>
#include <stdio.h>
#include <algorithm>
#include <iostream>
#include <string.h>
#include <math.h>
using namespace std;
int a[35][35],b[35][35],c[35][35];//数组b代表每次需要乘的矩阵,数组a代表最后的结果 ,c中间变量
int main()
{
int n,m,i,j,ci,k,kk;
cin>>n>>m;
for(i=0;i<n;i++)
for(j=0;j<n;j++)
cin>>a[i][j];
if(m==0)//m==0代表是单位矩阵
{
for(i=0;i<n;i++)
for(j=0;j<n;j++)
{
if(i==j)
a[i][j]=1;
else
a[i][j]=0;
}
}
else
{
for(i=0;i<n;i++)
for(j=0;j<n;j++)
b[i][j]=a[i][j];//赋予数组b值,和输入的a数组是一毛一样的
k=0;
for(ci=1;ci<m;ci++)//乘以矩阵b的次数
{
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
for(int jj=0;jj<n;jj++)
{
c[i][j]+=a[i][jj]*b[jj][j];//最核心的步骤(根据线代数学的矩阵乘法)
}
}
}
for(i=0;i<n;i++)
for(j=0;j<n;j++)
a[i][j]=c[i][j];//数组a代表转化后的最后的结果 ,数组c代表存取更新的结果(中间变量)
memset(c,0,sizeof(c));//将数组c赋值0便于下次计算使用这个中间变量
}
}
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
cout<<a[i][j]<<" ";
cout<<endl;
}
return 0;
}
这个题挺简单的,只是第一次接触的话,核心的那个步骤容易想不出来,我也是想了很大一会才慢慢调试出来的。感觉还是不难,还是自己太菜了,没有那么快就想出来这个核心的一句话。
上一篇: Hbase的协处理器
下一篇: 蓝桥训练1 Fibonacci数列