矩阵
矩阵乘法:矩阵相乘最重要的方法是一般矩阵乘积。它只有在第一个矩阵的列数(column)和第二个矩阵的行数(row)相同时才有意义[1] 。一般单指矩阵乘积时,指的便是 一般矩阵乘积。一个m×n的矩阵就是m×n个数排成m行n列的一个数阵。由于它把许多数据紧凑的集中到了一起,所以有时候可以简便地表示一些复杂的模型。举个例子说明一下:
![](https://gss3.bdstatic.com/-Po3dSag_xI4khGkpoWK1HF6hhy/baike/s%3D38/sign=7bfc6256307adab439d01d4b8ad4bc69/902397dda144ad34da6756f9d6a20cf430ad85f0.jpg)
![](https://gss1.bdstatic.com/9vo3dSag_xI4khGkpoWK1HF6hhy/baike/s%3D34/sign=b993fb7eef24b899da3c7f3c6f068eaf/a2cc7cd98d1001e9a8aac571be0e7bec54e7973e.jpg)
![](https://gss1.bdstatic.com/-vo3dSag_xI4khGkpoWK1HF6hhy/baike/s%3D38/sign=3e54c2a930d12f2eca05a8684ec228bf/0824ab18972bd407704270837d899e510eb309c2.jpg)
![](https://gss0.bdstatic.com/94o3dSag_xI4khGkpoWK1HF6hhy/baike/s%3D52/sign=907a0f6c740e0cf3a4f74ef90a46ea25/bd315c6034a85edf8d995c5d4f540923dd5475b2.jpg)
![](https://gss1.bdstatic.com/9vo3dSag_xI4khGkpoWK1HF6hhy/baike/s%3D12/sign=00bd64853fdbb6fd215be12408244fe6/4e4a20a4462309f7c1357d6c740e0cf3d7cad672.jpg)
![](https://gss3.bdstatic.com/7Po3dSag_xI4khGkpoWK1HF6hhy/baike/s%3D17/sign=149b674c5cafa40f38c6cadaaa6459ed/d62a6059252dd42a4f5fd1d5053b5bb5c9eab87e.jpg)
![](https://gss1.bdstatic.com/9vo3dSag_xI4khGkpoWK1HF6hhy/baike/s%3D334/sign=5e0cfe86de33c895a27e9e78e5137397/8ad4b31c8701a18bd6fe9b5e992f07082838fe8e.jpg)
![](https://gss0.bdstatic.com/94o3dSag_xI4khGkpoWK1HF6hhy/baike/s%3D594/sign=01474d246759252da7171d0d009a032c/adaf2edda3cc7cd955ae9be73e01213fb80e9109.jpg)
注意:矩阵不满足结合律,其他的定律满足,即AB!=BA。
判断两个矩阵是否可以相乘的条件:矩阵只有当左边矩阵的列数等于右边矩阵的行数时,它们才可以相乘!
矩阵的简单运用:
Description
在数学中,矩阵是一个按照长方阵列排列的复数或实数集合,最早来自于方程组的系数及常数所构成的方阵。这一概念由19世纪英国数学家凯利首先提出。
矩阵是高等代数学中的常见工具,也常见于统计分析等应用数学学科中。在物理学中,矩阵于电路学、力学、光学和量子物理中都有应用;计算机科学中,三维动画制作也需要用到矩阵。 矩阵的运算是数值分析领域的重要问题。将矩阵分解为简单矩阵的组合可以在理论和实际应用上简化矩阵的运算。对一些应用广泛而形式特殊的矩阵,例如稀疏矩阵和准对角矩阵,有特定的快速运算算法。
作为A+B问题,我们在此掌握矩阵的加法运算:
$$ \left( \begin{matrix} a_{11} & a_{12} & a_{13} \\ a_{21} & a_{22} & a_{23} \\ a_{31} & a_{32} & a_{33} \end{matrix}\right) + \left( \begin{matrix} b_{11} & b_{12} & b_{13} \\ b_{21} & b_{22} & b_{23} \\ b_{31} & b_{32} & b_{33} \end{matrix}\right) = \left( \begin{matrix} a_{11} + b_{11} & a_{12}+ b_{12} & a_{13}+ b_{13} \\ a_{21}+ b_{21} & a_{22}+ b_{22} & a_{23}+ b_{23} \\ a_{31}+ b_{31} & a_{32}+ b_{32} & a_{33}+ b_{33} \end{matrix}\right)$$
上式就表示两个3*3
矩阵的加法,聪明的你应该想到n*m
的矩阵运算法则:两个n*m
矩阵A
和B
的和,一样是个n*m
矩阵,其内的各元素为其相对应元素相加后的值。
现在给你两个矩阵A
、B
,请你输出得到的A+B
结果矩阵。
Input
第一行是两个数n
、m
,表示给出两个n
行m
列的矩阵。
下面n
行描述矩阵A
,再下面n
行描述矩阵B
。
详细格式请参考样例。
1 ≤ n ≤ 50
1 ≤ m ≤ 50
0 ≤ |aij| ≤ 105
0 ≤ |bij| ≤ 105
Output
请输出n
行数描述矩阵A+B
。
每行的m
个数用一个空格分隔开,行末不需要空格。
Sample Input
2 3 1 2 3 3 4 5 1 1 0 1 2 0
Sample Output
2 3 3 4 6 5
Hint
请严格按照格式输出,不要输出多余空格。
#include<stdio.h>
int a[521][521],b[521][521],c[521][521]={0};//数组比较大时,定义在main函数的外面//
int main()
{
int m,n;
scanf("%d%d",&n,&m);
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
scanf("%d",&a[i][j]);
}
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
scanf("%d",&b[i][j]);
}
for(int i = 0; i < n;i++)
{
for(int j=0;j<m;j++)
{
c[i][j]=a[i][j]+b[i][j];//该公式实现矩阵加法//
}
}
for(int i=0;i<n;i++)//输出//
{
for(int k=0;k<m;k++)
{
printf("%d",c[i][k]);
if(k==m-1)
printf("\n");
else
printf(" ");
}
}
return 0 ;
}
下面再看一道题目:
Description
给定两个矩阵$A$和$B$,你需要判断它们是否可以相乘,若可以请输出相乘后的矩阵。
Input
第一行输入一个整数$T$,代表有$T$组测试数据。
每组数据第一行输入两个整数$N,M$,代表矩阵$A$的行、列。
接下来$N$行,每行输入$M$个整数$a[][]$。
之后一行输入两个整数$n,m$,代表矩阵$B$的行、列。
接下来$n$行,每行输入$m$个整数$b[][]$。
注:$1 <= T <= 500,1 <= N,m <= 100,1 <= M,n <= 10,1 <= $矩阵元素$<= 20$。
Output
若矩阵$A、B$可以相乘,先输出$YES$,再输出相乘得到的矩阵。
对每行的矩阵元素,每两个元素之间有一个空格,最后一个没有空格。
反之输出$NO$。
Sample Input
2 2 2 1 1 1 1 2 3 1 1 1 1 1 1 2 3 1 1 1 1 1 1 2 2 1 1 1 1
Sample Output
YES 2 2 2 2 2 2 NO
#include<stdio.h>
int a[521][521],b[521][521];
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
//根据行列式乘法规则,左乘矩阵的列数 = 右乘矩阵的行数
//不满足就不能相乘//
int n,m,p,q;
scanf("%d%d",&n,&m);
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
scanf("%d",&a[i][j]);
}
scanf("%d%d",&p,&q);
for(int i=0;i<p;i++)
{
for(int j=0;j<q;j++)
scanf("%d",&b[i][j]);
}
if(m!=p)
{
printf("NO\n");
}
else
{
printf("YES\n");
for(int i = 0; i < n;i++)
{
for(int j=0;j<q;j++)
{
int ans=0;
for(int k=0;k<m;k++)
ans+=a[i][k]*b[k][j];
printf("%d",ans);
if(j!=q-1)
printf(" ");
else
printf("\n");
}
}
}
}
return 0 ;
}
愿你走过半生,归来仍是少年!