矩阵和数组的概念及其区别
矩阵和数组在MATLAB中存在很多方面的区别,主要有以下几个方面:
矩阵是数学上的概念,而数组是计算机程序设计领域的概念。
作为一种变换或者映射运算符的体现,矩阵运算有着明确而严格的数学规则;而数组运算是MATLAB软件定义的规则,其目的是使数据管理方便,操作简单,命令形式自然,执行计算有效。
矩阵和数组间的联系主要体现在:
在MATLAB中,矩阵是以数组的形式存在的。因此,一维数组相当于向量,二维数组相当于矩阵,所以矩阵是数组的子集。
只有一行的矩阵,称为行向量。 只有一列的矩阵,称为列向量。
矩阵的构造
1、直接赋值建立简单矩阵
简单矩阵采用矩阵构造符号——方括号“ [ ] ”,将矩阵元素置于方括号内,同行元素之间用空格或逗号隔开,行与行之间用分号 “ ; ”隔开。
2、构造特殊矩阵
使用MATLAB中提供的构造特殊矩阵的函数。
hilb()函数 -- 希尔伯特(Hilbert)矩阵
希尔伯特矩阵,也称H阵,其元素为。由于它是一个条件数差的矩阵,所以将它用来作为试验矩阵。
hilb(n):用于生成一个n×n的希尔伯特矩阵。
invhilb(n):用于生成一个n×n的希尔伯特矩阵的逆矩阵整数矩阵。
>> hilb(3)
ans =
1.0000 0.5000 0.3333
0.5000 0.3333 0.2500
0.3333 0.2500 0.2000
>> invhilb(3)
ans =
9 -36 30
-36 192 -180
30 -180 180
toeplitz()函数 -- 托普利兹(Toeplitz)矩阵
toeplitz(k,r):用于生成非对称托普利兹矩阵,第1列为k,第1行为r,其余元素等于其左上角元素。
toeplitz(c):用于用向量c生成一个对称的托普利兹矩阵。
上述 k、r、c 通常是某段数值范围,但也可以是单个数字。
>> toeplitz(1:4,1:2:7) % 行和列的起始数字应相同
ans =
1 3 5 7
2 1 3 5
3 2 1 3
4 3 2 1
>> toeplitz(1:4)
ans =
1 2 3 4
2 1 2 3
3 2 1 2
4 3 2 1
rand()函数 -- 0~1间均匀分布的随机矩阵
rand()函数产生0~1间均匀分布的随机矩阵,其调用格式如下:
r=rand(n):产生维数为n×n的0~1间均匀分布的随机矩阵。
r=rand(m,n):产生维数为n×m的0~1间均匀分布的随机矩阵。
r=rand(m,n,p,...):产生维数为n×m×p的0~1间均匀分布的随机矩阵。
r=rand(size(A)):产生维数为n×m×p与矩阵A相同的0~1间均匀分布的随机矩阵。
>> A=rand(3) % 生成 3*3 的随机矩阵
A =
0.9961 0.1067 0.7749
0.0782 0.9619 0.8173
0.4427 0.0046 0.8687
>> B=rand(3,4) % 生成 3*4 的随机矩阵
B =
0.0844 0.8001 0.1818 0.1361
0.3998 0.4314 0.2638 0.8693
0.2599 0.9106 0.1455 0.5797
>> C=rand(size(B)) % 生成和矩阵 B 相同维度的随机矩阵
C =
0.5499 0.6221 0.4018 0.1233
0.1450 0.3510 0.0760 0.1839
0.8530 0.5132 0.2399 0.2400
randn()函数 -- 标准正态分布随机矩阵
randn()函数产生均值为0、方差为1的随机矩阵,其调用格式如下:
r=randn(n)
r=randn(m,n)
r=randn(m,n,p,...)
r=randn([m,n,p,...])
r=randn(size(A))
其格式可参考上述rand()函数。
magic()函数 -- 魔方(幻方)矩阵
magic()函数产生魔方(幻方)矩阵。魔方矩阵中每行、每列和两条对角线上的元素和相等, 其调用格式如下。
M=magic(n)
pascal()函数 -- 帕斯卡矩阵
pascal()函数产生帕斯卡矩阵,其调用格式如下:
A=pascal(n):返回n阶的对称正定Pascal矩阵,其中的元素是由Pascal三角组成的,其逆矩阵的元素都是整数。
A=pascal(n,1):返回由下三角的Cholesky因子组成的Pascal矩阵,它是对称的,所以它是自己的逆。
A=pascal(n,2):返回pascal(n,1)的转置和交换形式。A是单位矩阵的立方根。
vander()函数 -- 范德蒙矩阵
vander()函数产生范德蒙矩阵,其调用格式如下:
A=vander(v):生成范德蒙矩阵,矩阵的列是向量v的幂,即A(i,j)=v(i)^(n-j),其中n=length(v)。
使用vander()函数产生范德蒙矩阵,输入向量可以是行向量或列向量。
>> vander(1:2:5) % 行向量做参数
ans =
1 1 1
9 3 1
25 5 1
>> vander([1;3;5]) % 列向量做参数
ans =
1 1 1
9 3 1
25 5 1
3、向量、标量
当m=1或n=1,即1×n或m×1时,建立的矩阵称为向量。
当m=n=1时,建立的矩阵称为标量。任意以1×1的矩阵形式表示的单个实数、复数都是标量。
4、空矩阵
空矩阵可以通过赋值语句建立。
>> a=[ ] % 构建一个空矩阵
a =
[]
空矩阵和0矩阵的本质区别在于:空矩阵内没有任何元素,因此不占用任何存储空间;而0矩阵表示该 矩阵中的所有元素全部为0,需要占用一定的存储空间。
矩阵大小及结构的改变
矩阵大小及结构的改变方式主要有旋转矩阵、改变矩阵维度、删除矩阵元素等。
矩阵下标引用
1、双下标索引
双下标索引是通过一个 二元数组对来对应元素在矩阵中的行列位置,例如A(2,3)表示矩阵A中第2行第3列的元素。
2、单下标索引
单下标索引的方式是采用列元素优先的原则,对m行n列的矩阵按列排序进行重组,成为一维数组,再取新的一维数组中的元素位置对应的值作为元素在原矩阵中的单下标。例如对于4×4的矩阵,A(7)表示矩阵A中第3行第2列的元 素,而A(13)表示矩阵A中第1行第4列的元素。
3、单下标和双下标间转换
sub2ind函数
格式:IND = sub2ind ( siz , i , j )
说明:其功能为将双下标索引值转换为单下标索引值,其中siz是一个包含两个元素的数组,代表了转换矩阵的行列数,一般可以直接用size(A)表示;i与j分别是双下标索引中的行、列值;IND是转换后的单下标索引 值。
ind2sub函数
格式:[ i j ] = ind2sub ( siz , ind )
说明:其功能为将单下标索引值转换为双下标索引值,各变量意义同上。
>> A=magic(3) % 创建一个 3*3 的幻方矩阵
A =
8 1 6
3 5 7
4 9 2
>> IND=sub2ind ( size(A),2,3 ) % 双下标转换为单下标
IND =
8
>> [ i j ]=ind2sub( size(A),7 ) % 单下标转换为双下标
i =
1
j =
3
4、多个矩阵元素的索引
在下标表达式中,可以用冒号来表示矩阵的多个元素。
如:
A ( m : n , j ) 表示矩阵从第 m 行到第 n 行,第 j 列的元素
A ( m : i : n , j ) 表示矩阵第 m 行、第 m+i 行、... 、直到第 n 行,第 j 列的元素
A ( : , j ) 表示矩阵所有行的第 j 列元素
A ( : , end ) 表示矩阵所有行的最后一列元素(end 表示最后一行或最后一列)
A ( [1 3] , j ) 表示矩阵第 1 行、第 3 行,第 j 列的元素
以上所有示例同样适用于列,或者行列混合索引。
5、矩阵索引常用表达式
矩阵信息的获取
1、矩阵结构
矩阵的结构是指矩阵子元素的排列方式。
这类函数的返回值是逻辑类型的数据。返回值为“1”表示该矩阵是某一特定类型的矩阵;返回值为“0”表 示该矩阵不是该特定类型的矩阵。
2、矩阵大小
包括矩阵的维数, 矩阵各维(如最长维、用户指定的维)的长度,矩阵元素的个数。
ndims函数
对于空矩阵、标量矩阵、一维矩阵和二维矩阵,MATLAB都将其作为普通二维数组对待。特别需要注意的是,用 [ ] 产生的空矩阵是作为二维矩阵的,但是在高维矩阵中也有空矩阵的概念,此时空矩阵则具有多个维度。
>> A=[ ]; % 空矩阵
>> B=5; % 标量
>> C=1:3; % 一维矩阵
>> D=magic(2); % 二维矩阵
>> E( : , : , 2 ) = [1,3 ; 2,4]; % 三维矩阵
>> x=[ ndims(A) , ndims(B) , ndims(C) , ndims(D) , ndims(E) ]
x =
2 2 2 2 3
size函数
size函数的返回值可以是分开显示的单个实数变量,也可以是一个行向量;
在size函数的输入参数中增加维度参数可以获取指定维度的长度,其中“1”表示行,“2”表示列。
>> A=[ ];
>> B=[1,2,3,4];
>> C=[0,2,4;1,3,5];
>> size(A) % 空矩阵
ans =
0 0
>> size(B) % 一维数组(矩阵),行数 1 ,列数 4
ans =
1 4
>> size(C) % 二维数组(矩阵),行数 2 ,列数 3
ans =
2 3
>> size(C,2) % 矩阵的列数
ans =
3
3、矩阵的数据类型
矩阵作为MATLAB的内部数据存储和运算结构,其元素可以是各种各样的数据类型, 对应不同数据类型的元素,可以是数值、字符串、元胞、结构体等。
4、矩阵占用的内存
通过whos命令查看 当前工作区中指定变量的所有信息,包括变量名、矩阵大小、内存占用和数据类型等。
>> C=[0,2,4;1,3,5];
>> whos C
Name Size Bytes Class Attributes
C 2x3 48 double
矩阵修改、扩展与合并
1、矩阵元素的修改
可以通过下标索引的方式修改矩阵元素,具体方法参考: 矩阵下标引用 。
如:
A( i , j ) = value:等号左侧为矩阵中的某个元素;等号右侧为值。
A = [ ] :删除矩阵中的所有元素。
2、矩阵元素的扩展与删除
>> A=[ 1 1 ; 2 2 ]
A =
1 1
2 2
>> A(3 , : ) = 3 % 给整行赋值,增加行
A =
1 1
2 2
3 3
>> A(4 , 1) = 4 % 给新行的元素依次赋值,增加行
A =
1 1
2 2
3 3
4 0
>> A(4 , 2) = 4
A =
1 1
2 2
3 3
4 4
>> A(2 , : )=[ ] % 将整行赋值为空,删除行
A =
1 1
3 3
4 4
3、矩阵合并函数
将两个矩阵按某个维度进行合并操作时,原始的两个矩阵要在某一个维度上具有相同的长度,否则MATLAB在进行计算时就会发生错误。
针对二维矩阵A、B:[A,B]表示按列存储合并矩阵,即将B矩阵接到A矩阵的列后面;[A;B]表示按行存储合并矩阵,即 将B矩阵接到A矩阵的行后面。
>> A=ones(2,3)
A =
1 1 1
1 1 1
>> B=zeros(2,3)
B =
0 0 0
0 0 0
>> [A , B] % 按列,合并在后面,水平方向
ans =
1 1 1 0 0 0
1 1 1 0 0 0
>> [A ; B] % 按行,合并在下面,竖直方向
ans =
1 1 1
1 1 1
0 0 0
0 0 0
常用合并函数:
矩阵元素的查找
MATLAB中函数find()的作用是进行矩阵元素的查找,它通常与关系函数和逻辑运算相结合。其调用格 式如下。
ind=find(X):该函数查找矩阵X中的非零元素,函数返回这些元素的单下标。
[row,col]=find(X,...):该函数查找矩阵X中的非零元素,函数返回这些元素的双下标i和j。
>> A=[ 1 3 0 ; 3 1 0 ; 9 2 4 ]
A =
1 3 0
3 1 0
9 2 4
>> B=find(A) % 返回矩阵 A 中非 0 数值的下标,列向量
B =
1
2
3
4
5
6
9
>> C=find(A>1) % 返回矩阵 A 中大于 1 的数值的下标
C =
2
3
4
6
9
>> A(find(A==0))=-1 % 找到矩阵 A 中值为 0 的数据,并赋值为 -1
A =
1 3 -1
3 1 -1
9 2 4
矩阵元素的排序
MATLAB中函数sort()的作用是按照升序排序,排序后的矩阵和原矩阵的维数相同。其调用格式如下。
B=sort(A):该函数对矩阵A进行升序排序。A可为矩阵或向量。
B=sort(A,dim):该函数对矩阵A进行升序排序,并将结果返回在给定的维数dim上按照升序排序。当dim=1时,按照列进行排 序;当dim=2时,按照行进行排序。
B=sort(...,mode):该函数对矩阵A进行排序,mode可指定排序的方式。ascend指定按升序排序,为默认值;descend指定按降序 排序。
>> A=[1 3 0 ; 3 1 0 ; 9 2 4 ]
A =
1 3 0
3 1 0
9 2 4
>> sort(A) % 排序,默认按列、升序
ans =
1 1 0
3 2 0
9 3 4
>> sort(A,1) % 按列排序,默认升序
ans =
1 1 0
3 2 0
9 3 4
>> sort(A,2) % 按行排序,默认升序
ans =
0 1 3
0 1 3
2 4 9
>> sort(A,'descend') % 降序排序,默认按列
ans =
9 3 4
3 2 0
1 1 0
>> sort(A,2,'descend') % 按行降序排序
ans =
3 1 0
3 1 0
9 4 2
>> %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
>> % 对向量进行排序
>> B=[2 7 3 0 8 5 ]
B =
2 7 3 0 8 5
>> sort(B)
ans =
0 2 3 5 7 8
矩阵元素的求和
MATLAB中函数sum()和cumsum()的作用是对矩阵的元素求和。其调用格式如下。
B=sum(A):该函数对矩阵A的元素求和,返回由矩阵A各列元素的和组成的向量。
B=sum(A,dim):该函数返回在给定的维数dim上元素的和。当dim=1时,计算矩阵A各列元素的和;当dim=2时,计算矩阵A各行元素的和。
B=cumsum(A)。
B=cumsum(A,dim)。
函数cumsum()的调用格式与sum()类似,不同的是其返回值为矩阵。
使用sum(sum())可求出矩阵所有元素的和。
>> A=[ 1 3 0 ; 3 1 0 ; 9 2 4 ]
A =
1 3 0
3 1 0
9 2 4
>> sum(A) % 按列求和,将每列的元素相加
ans =
13 6 4
>> sum(A,2) % 按行求和,将每行的元素相加
ans =
4
4
15
>> cumsum(A) % 按列渐次求和,第 1 行不变,第 n 行值为 1 ~ n 行对应列的元素之和
ans =
1 3 0
4 4 0
13 6 4
>> cumsum(A,2) % 按行渐次求和,第 1 列不变,第 n 列值为 1 ~ n 列对应行的元素之和
ans =
1 4 4
3 4 4
9 11 15
>> sum(sum(A)) % 求矩阵所有元素之和
ans =
23
矩阵元素的求积
MATLAB中函数prod()和cumprod()的作用是对矩阵的元素求积。其调用格式如下。
B=prod(A):该函数对矩阵A的元素求积,返回由矩阵A各列元素的积组成的向量。
B=prod(A,dim):该函数返回在给定的维数dim上元素的积。当dim=1时,计算矩阵A各列元素的积;当dim=2时,计算矩阵A各 行元素的积。
B=cumprod(A)。
B=cumprod(A,dim)。
函数cumprod()的调用格式与prod()类似,不同的是其返回值为矩阵。
类同与矩阵元素的求和。
矩阵元素的差分
MATLAB中函数diff()的作用是计算矩阵元素的差分。其调用格式如下。
Y=diff(X):计算矩阵各列元素的差分。
Y=diff(X,n):计算矩阵各列元素的n阶差分。
Y=diff(X,n,dim):计算矩阵在给定的维数dim上元素的n阶差分。当dim=1时,计算矩阵各列元素的差分;当dim=2时,计算矩 阵各行元素的差分。
当参数n≥size(x,dim)时,函数的返回值是空矩阵。
矩阵分析、分解、特征值和特征向量
1、矩阵分析函数
2、矩阵分解函数
3、特征值与特征向量函数。
eig(A):求包含矩阵A的特征值的向量。
[X,D]=eig(A):产生一个矩阵A的特征值在对角线上的对角矩阵D和矩阵X,它们的列是相应的特征向量,满足AX=XD。为了 得到有更好条件特征值的矩阵,要进行相似变换。
[T,B]=balance(A):找到一个相似变换矩阵T和矩阵B,使得它们满足B=T-A∙T。B是用命令balance求得的平衡矩阵。
eig(A,'nobalance'):不经过平衡处理求得矩阵A的特征值和特征向量,也就是不进行平衡相似变换。
eigs(A):返回一个由矩阵A的部分特征值组成的向量,和eig命令一样,但是不返回全部的特征值。如果不带有参量,则计算 出最大的特征值。当计算所有特征值时,如果矩阵A的秩不小于6,则计算出6个特征值。
eigs(f,n):求出矩阵A的部分特征值。在使用一个矩阵列的线性运算符时,字符串f中包含的是M文件的文件名,n指定问题的 阶次。用这种方法来求特征值比开始就用运算符来求要快。
eigs(A,B,k,sigma):求矩阵A的部分特征值,矩阵B的大小和A相同;如果没有给出B=eye(size(A)),那么k就是要计算的特征值 的个数;如果k没有给出,就用小于6的数或者A的秩。
变量sigma是一个实数或复数的移位参数,或者下列文本字符串中的一个,文本字符串指明的是特征值 的属性:“lm”为最大的特征值,“sm”为最小的特征值,“lr”为最大的实数部分,“sr”为最小的实数部 分,“be”为同时求得最大和最小的实数部分。
condeig(A):返回一个由矩阵A的特征值条件数组成的向量。
[V,D,s]=condeig(A):返回[V,D]=eig(A)和s=condeig(A)。
稀疏矩阵
在许多问题中提到了含有大量0元素的矩阵,这样的矩阵称为稀疏矩阵。为了节省存储空间和计算时间,MATLAB考虑到矩阵的稀疏性,在对它进行运算时有特殊的命令。
稀疏矩阵大部分元素是0,因此只需存储非零元素的下标和元素值,这种特殊的存储方式可以节省大量的存储空间和不必要的运算。
节省存储空间:如果MATLAB把一个矩阵当作稀疏矩 阵,那么只需在m×3的矩阵中存储m个非零项。第1列是行下标,第2列是列下标,第3列是非零元素值,不 必保存0元素。如果存储每个浮点数需要8字节,存储每个下标需要4字节,那么整个矩阵在内存中存储需要 16×m字节。
节省计算时间:相对于普通矩阵来说,稀疏矩阵的计算速度更快,因为MATLAB只对非零元素进行操作,这是稀疏矩阵第二个突出的优点。
1、稀疏矩阵的生成
sparse()函数创建稀疏矩阵
输入稀疏矩阵
>> % 参数依次为:行号,列号,元素值
>> % 显示矩阵内容时,按列为顺序依次显示
>> s=sparse([1,2,3,4,5],[2,1,4,6,2],[10,3,-2,-5,1])
s =
(2,1) 3
(1,2) 10
(5,2) 1
(3,4) -2
(4,6) -5
满矩阵转和稀疏矩阵的互换
>> A=[1 0 0 0 ; 0 5 0 0 ; 2 0 0 7]
A =
1 0 0 0
0 5 0 0
2 0 0 7
>> S=sparse(A) % 满矩阵转换为稀疏矩阵
S =
(1,1) 1
(3,1) 2
(2,2) 5
(3,4) 7
>> B=full(S) % 稀疏矩阵转换为满矩阵
B =
1 0 0 0
0 5 0 0
2 0 0 7
创建特殊稀疏矩阵
2、查看稀疏矩阵
>> A=[ 0 0 0 1 ; 0 0 8 0 ; 4 0 0 0 ; 0 0 0 0 ]
A =
0 0 0 1
0 0 8 0
4 0 0 0
0 0 0 0
>> S=sparse(A); % 创建稀疏矩阵
>> n1=nnz(S) % 查看非零元素的个数
n1 =
3
>> n2=nonzeros(S) % 查看非零元素的值
n2 =
4
8
1
>> n3=nzmax(S) % 查看稀疏矩阵的存储空间
n3 =
3
>> spy(S) % 对稀疏矩阵中非零元素的分布进行图形化显示
稀疏矩阵中非零元素的分布
3、稀疏矩阵的运算
满矩阵的四则运算对稀疏矩阵同样有效,但是返回结果有可能是稀疏矩阵或满矩阵。
对于单个稀疏矩阵的输入,大部分函数输出的结果都是稀疏矩阵,有部分函数输出的结果是满矩阵。
对于多个矩阵的输入,如果其中至少有一个矩阵是满矩阵,那么大部分函数的输出结果是满矩阵。
对于矩阵的加、减、乘、除运算,只要其中有一个矩阵是满矩阵,则输出的结果都是满矩阵。
稀疏矩阵的数乘为稀疏矩阵;稀疏矩阵的幂为稀疏矩阵。
文章来源地址https://www.toymoban.com/news/detail-766800.html文章来源:https://www.toymoban.com/news/detail-766800.html
到了这里,关于MATLAB中的矩阵的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!