目录
一、矩阵的定义
在数学中,矩阵(Matrix)是一个按照长方阵列排列的复数或实数集合 ,最早来自于方程组的系数及常数所构成的方阵。这一概念由19世纪英国数学家凯利首先提出。
矩阵是高等代数学中的常见工具,也常见于统计分析等应用数学学科中。 在物理学中,矩阵于电路学、力学、光学和量子物理中都有应用;计算机科学中,三维动画制作也需要用到矩阵。 矩阵的运算是数值分析领域的重要问题。将矩阵分解为简单矩阵的组合可以在理论和实际应用上简化矩阵的运算。对一些应用广泛而形式特殊的矩阵,例如稀疏矩阵和准对角矩阵,有特定的快速运算算法。关于矩阵相关理论的发展和应用,请参考《矩阵理论》。在天体物理、量子力学等领域,也会出现无穷维的矩阵,是矩阵的一种推广。
由 m × n 个数排成的m行n列的数表称为m行n列的矩阵,简称m × n矩阵。记作:
这m×n 个数称为矩阵A的元素,简称为元,数aij位于矩阵A的第i行第j列,称为矩阵A的(i,j)元,以数 aij为(i,j)元的矩阵可记为()或(
)m × n,m×n矩阵A也记作
。
注意:矩阵的概念很多,而且矩阵的运算属于计算机图形学,数学等学科的必备知识,其如果要完全写下来则完全可以写出一本书,本文知识简单介绍,矩阵的基本知识必备要了解加减乘除,其中以乘法在计算机中又使用众多。
二、矩阵的算法
矩阵运算在科学计算中非常重要,而矩阵的基本运算包括矩阵的加法,减法,数乘,转置,共轭和共轭转置。
2.1 矩阵的加法
通常的矩阵加法被定义在两个相同大小的矩阵。两个m×n矩阵A和B的和,标记为A+B,一样是个m×n矩阵,其内的各元素为其相对应元素相加后的值。例如:
矩阵的加法满足下列运算律(A,B,C都是同型矩阵):
A + B = B + A
(A + B) + C = A + (B + C)
不同矩阵的加法运算为直和:
注意:到两个方阵的直和可以表示两个图论的联集之邻接矩阵。
2.2 矩阵的减法
通常的矩阵减法运算同上,例如:
2.3 矩阵的乘法
两个矩阵的乘法仅当第一个矩阵A的列数和另一个矩阵B的行数相等时才能定义。设A为 m x p 的矩阵,B为 p x n 的矩阵,那么称 m x n 的矩阵C为矩阵A与B的乘积,记作 C = AB,其中矩阵C中的第i行第j列元素可以表示为:
例如:
并将此乘积记为: C = AB
矩阵的乘法满足以下运算律:
结合律:(AB)C = A(BC)
左分配律:(A+B)C = AC + BC
右分配律:C(A + B) = CA + CB
C语言实现操作:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define M 100
int main(){
int i,j,k;
int matrix1[M][M],matrix2[M][M],row1,col1,row2,col2;
int ans[M][M]; //运算结果,矩阵输出
printf("输入第一个矩阵的行高和列宽:");
scanf("%d%d",&row1,&col1);
printf("输入第一个矩阵:\n");
for(i=0;i<row1;i++){
for(j=0;j<col1;j++){
scanf("%d",&matrix1[i][j]);
}
}
printf("输入第二个矩阵的行高和列宽:");
scanf("%d%d",&row2,&col2);
printf("输入第二个矩阵:\n");
for(i=0;i<row2;i++){
for(j=0;j<col2;j++){
scanf("%d",&matrix2[i][j]);
}
}
memset(ans,0,sizeof(ans));
printf("运算结果为:\n");
for(i=0;i<row1;i++){
for(j=0;j<col2;j++){
for(k=0;k<col1;k++){
ans[i][j]=ans[i][j]+matrix1[i][k]*matrix2[k][j];
}
}
}
for(i=0;i<row1;i++){
for(j=0;j<col2;j++){
printf("%d ",ans[i][j]);
}
printf("\n");
}
return 0;
}
操作结果:
2.4 矩阵的转置
设A为m×n阶矩阵(即m行n列),第i 行j 列的元素是a(i,j),即:
把m×n矩阵A的行换成同序数的列得到一个n×m矩阵,此矩阵叫做A的转置矩阵,记做或A'
例如矩阵:
转置后
矩阵的转置和加减乘除一样,也是一种运算,且满足下列运算规律(假设运算都是可行的):
2.5 矩阵的共轭
当为 = (
)复矩阵时,用
表示
的共轭复数,记
= (
) ,则为A的共轭矩阵。埃尔米特矩阵(或自共轭矩阵)是相对其主对角线以复共轭方式(实部不变,虚部取负)对称, 例如
2.6 对称矩阵
图 1 对称矩阵示意图
图 1 的矩阵中,数据元素沿主对角线对应相等,这类矩阵称为对称矩阵。
矩阵中有两条对角线,其中图 1 中的对角线称为主对角线,另一条从左下角到右上角的对角线为副对角线。对称矩阵指的是各数据元素沿主对角线对称的矩阵。
结合数据结构压缩存储的思想,我们可以使用一维数组存储对称矩阵。由于矩阵中沿对角线两侧的数据相等,因此数组中只需存储对角线一侧(包含对角线)的数据即可。
对称矩阵的实现过程是,若存储下三角中的元素,只需将各元素所在的行标 i 和列标 j 代入下面的公式:
存储上三角的元素要将各元素的行标 i 和列标 j 代入另一个公式:
最终求得的 k 值即为该元素存储到数组中的位置(矩阵中元素的行标和列标都从 1 开始)。
例如,在数组 skr[6] 中存储图 1 中的对称矩阵,则矩阵的压缩存储状态如图 3 所示(存储上三角和下三角的结果相同):
图 3 对称矩阵的压缩存储示意图
注意,以上两个公式既是用来存储矩阵中元素的,也用来从数组中提取矩阵相应位置的元素。例如,如果想从图 3 中的数组提取矩阵中位于 (3,1) 处的元素,由于该元素位于下三角,需用下三角公式获取元素在数组中的位置,即:
结合图 3,数组下标为 3 的位置存储的是元素 3,与图 1 对应。
2.7 上(下)三角矩阵
图 4 上(下)三角矩阵
如图 4 所示,主对角线下的数据元素全部相同的矩阵为上三角矩阵(图 4a)),主对角线上元素全部相同的矩阵为下三角矩阵(图 4b))。
对于这类特殊的矩阵,压缩存储的方式是:上(下)三角矩阵采用对称矩阵的方式存储上(下)三角的数据(元素 0 不用存储)。
例如,压缩存储图 4a) 中的上三角矩阵,矩阵最终的存储状态同图 3 相同。因此可以得出这样一个结论,上(下)三角矩阵存储元素和提取元素的过程和对称矩阵相同。
2.8 稀疏矩阵
图 5 稀疏矩阵示意图
如图 5 所示,如果矩阵中分布有大量的元素 0,即非 0 元素非常少,这类矩阵称为稀疏矩阵。
压缩存储稀疏矩阵的方法是:只存储矩阵中的非 0 元素,与前面的存储方法不同,稀疏矩阵非 0 元素的存储需同时存储该元素所在矩阵中的行标和列标。
例如,存储图 5 中的稀疏矩阵,需存储以下信息:
- (1,1,1):数据元素为 1,在矩阵中的位置为 (1,1);
- (3,3,1):数据元素为 3,在矩阵中的位置为 (3,1);
- (5,2,3):数据元素为 5,在矩阵中的位置为 (2,3);
- 除此之外,还要存储矩阵的行数 3 和列数 3;
由此,可以成功存储一个稀疏矩阵。
注意,序号 2.6、2.7、2.8 这3 种特殊矩阵的压缩存储,除了将数据元素存储起来,还要存储矩阵的行数值和列数值,具体的实现方式后续会介绍 3 种,本节仅需了解矩阵压缩存储的原理。