矩阵乘法与运用

来源:互联网 发布:dota后期三大核 知乎 编辑:程序博客网 时间:2024/06/05 04:57

矩阵

矩阵乘法:矩阵相乘最重要的方法是一般矩阵乘积。它只有在第一个矩阵的列数(column)和第二个矩阵的行数(row)相同时才有意义[1]  。一般单指矩阵乘积时,指的便是    一般矩阵乘积。一个m×n的矩阵就是m×n个数排成m行n列的一个数阵。由于它把许多数据紧凑的集中到了一起,所以有时候可以简便地表示一些复杂的模型。举个例子说明一下:

A
  
的矩阵,B
  
的矩阵,那么称
  
的矩阵C为矩阵AB的乘积,记作
  
,其中矩阵C中的第
 
行第
  
列元素可以表示为:
如下所示:

注意:矩阵不满足结合律,其他的定律满足,即AB!=BA

判断两个矩阵是否可以相乘的条件:矩阵只有当左边矩阵的列数等于右边矩阵的行数时,它们才可以相乘!

矩阵的简单运用:

矩阵A+B

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矩阵AB的和,一样是个n*m矩阵,其内的各元素为其相对应元素相加后的值。

现在给你两个矩阵AB,请你输出得到的A+B结果矩阵。

Input

第一行是两个数nm,表示给出两个nm列的矩阵。

下面n行描述矩阵A,再下面n行描述矩阵B

详细格式请参考样例。

1 ≤ n ≤ 50

1 ≤ m ≤ 50

0 ≤ |aij| ≤ 105

0 ≤ |bij| ≤ 105

Output

请输出n行数描述矩阵A+B

每行的m个数用一个空格分隔开,行末不需要空格。

Sample Input

2 31 2 33 4 51 1 01 2 0 

Sample Output

2 3 34 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");elseprintf(" ");}}return 0 ;}

下面再看一道题目:

矩阵乘法
Time Limit:1000MS     Memory Limit:131072KB     64bit IO Format:%lld & %llu

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

22 21 11 12 31 1 11 1 12 31 1 11 1 12 21 11 1 

Sample Output

YES2 2 22 2 2NO 
代码如下:

#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(" ");elseprintf("\n");}}}}return 0 ;}
愿你走过半生,归来仍是少年!

原创粉丝点击