1、矩阵的表示
(1)矩阵的建立
①利用直接输入法建立矩阵:将矩阵的元素用中括号括起来,按照矩阵行的顺序输入个元素,
同一行的各元素之间用逗号或空格分隔,不同行的元素之间用分号分隔。
>> a=[1,2,3;4,5,6;7,8,9]
a =
1 2 3
4 5 6
7 8 9
②利用已经建好的矩阵建立更大的矩阵:一个大矩阵可以由已经建立好的小矩阵拼接而成。
>> a=[1,2;3,4];
>> b=[5,6;7,8];
>> c=[a,b;b,a]
c =
1 2 5 6
3 4 7 8
5 6 1 2
7 8 3 4
③可以用实部矩阵和虚部矩阵构成复数矩阵。
>> a=[1,2;3,4];
>> b=[5,6;7,8];
>> c=a+i*b //对应相加
c =
1.0000 + 5.0000i 2.0000 + 6.0000i
3.0000 + 7.0000i 4.0000 + 8.0000i
④行向量(行矩阵)的生成
(i)使用冒号表达式:
格式: v1:v2:v3 其中v1为初始值,v2为步长,v3为终止值(步长可以省略,默认为1)
>> a=0:2:10
a =
0 2 4 6 8 10
(ii)linspace函数:
格式: linspace(a,b,n) 其中a为第一个元素,b为最后一个元素,n为元素总数(当n省略时自动生成100个元素)
>> x=linspace(1,2,5)
x =
1.0000 1.2500 1.5000 1.7500 2.0000 //跨度相同
(2)结构矩阵和单元矩阵
①结构矩阵
格式: 结构矩阵元素.成员名=表达式
a(1).x1=10;a(1).x2=‘wang’;a(1).x3=[1,2;3,4];
a(2).x1=11;a(2).x2=‘liu’;a(2).x3=[12,22;32,42];
a(3).x1=12;a(3).x2=‘han’;a(3).x3=[13,23;33,43];
a
a =
包含以下字段的 1×3 struct 数组:
x1
x2
x3
------------------------------------------------------------------------------------------------------------------
a(1) >> a(2) >> a(3)
ans = ans = ans =
包含以下字段的 struct: 包含以下字段的 struct: 包含以下字段的 struct:
x1: 10 x1: 11 x1: 12
x2: ‘wang’ x2: ‘liu’ x2: ‘han’
x3: [2×2 double] x3: [2×2 double] x3: [2×2 double]
a(1).x3 >> a(2).x3 >> a(3).x3
ans = ans = ans =
1 2 12 22 13 23
3 4 32 42 33 43
②单元矩阵
建立单元矩阵和一般矩阵相似,直接输入即可,但是元素要用大括号括起来。
>> a={10,'wang',[11,21;15,25];11,'liu',[55,56;65,66];12,'han',[114,115;125,126]}
a =
3×3 cell 数组
{[10]} {'wang'} {2×2 double}
{[11]} {'liu' } {2×2 double}
{[12]} {'han' } {2×2 double}
2、矩阵元素的引用和操作
(1)引用方式:
①通过下标来引用矩阵元素
格式为: 矩阵名(第几行,第几列)
>> a=[1,2,3,4;11,12,13,14;21,22,23,24;31,32,33,34]
a =
1 2 3 4
11 12 13 14
21 22 23 24
31 32 33 34
>> a(2,3) //第二行第三列的元素
ans =
13
>> a(2,4)=114; //修改第二行第四列的元素
>> a
a =
1 2 3 4
11 12 13 114
21 22 23 24
31 32 33 34
注意:如果给定下标超过原有矩阵范围,会自动用0补齐,且引用下标的值赋值为所给值,如下:(矩阵接着上一个)
>> a(5,5)=15
a =
1 2 3 4 0
11 12 13 114 0
21 22 23 24 0
31 32 33 34 0
0 0 0 0 15
②通过序号来引用
(i)在MATLAB中,矩阵元素按列存储,即首先存储第一列元素,然后存储第二列元素,知道最后一列元素。
矩阵元素的序号就是矩阵元素在内存中的排列顺序。(矩阵用上面扩展过的新矩阵)
>> a(7) >> a(11) >> a(17)
ans = ans = ans =
12 3 114
序号与下标是一一对应的,以m x n矩阵A为例,元素A(i,j)的序号为(j-1) x m+i。
(ii)矩阵元素的序号与下标可以利用sub2ind()函数和ind2sub函数实现相互转换。
sub2ind()函数:将矩阵中指定元素的行、列下标转换成存储的序号。调用格式为:
D=sub2ind(S,I,J)
其中S为行数和列数组成的向量,I为转换矩阵元素的行下标,J为转换矩阵元素的列下标,
如果I和J是矩阵的话,表示要将矩阵中的多个元素的行列下标转化成存储序号,I,J的行列数必须相同。
D也为矩阵,存储对应元素的序号,且行列数与I,J相同,一一对应
>> a=[1:3;4:6] //创建一个两行三列的矩阵
a =
1 2 3
4 5 6
参数S通过size()函数得到 >> size(a) //size(矩阵名)返回值为一个行向量,第一个元素为行数
ans = 第二个元素为列数
2 3
>> D=sub2ind(size(a),[1,2;2,2],[1,1;3,2])
D =
1 2 //(1,1) (2,1)
6 4 //(2,3) (2,2)
ind2sub()函数:将矩阵元素的序号转换成对应的下标,其格式为:
[I,J]=ind2sub(S,D)
其中I为行坐标,J为列坐标,S为行数和列数组成的向量,D为序号
若D为行向量,则I和J也为行向量,且列数相同
>> [I,J]=ind2sub([3,3],[1,3,5])
I =
1 3 2
J =
1 1 2
③利用冒号表达式获得子矩阵
子矩阵是由矩阵中的一部分元素构成的矩阵
格式:矩阵名(上边界行数:下边界行数,左边界列数:右边界列数)
特例:A(i,:) 第i行的全部元素
A(:,j) 第j列的全部元素
A(i:k,:) 第i~k行的所有元素 等
>> a=[1:5;6:10;11:15;16:20;21:25]
a =
1 2 3 4 5
6 7 8 9 10
11 12 13 14 15
16 17 18 19 20
21 22 23 24 25
>> a(2:4,2:4)
ans =
7 8 9
12 13 14
17 18 19
end运算符:表示某一维度的末尾元素下标(仍使用上一个矩阵)
>> a(2,2:end) //第二行第二个元素到最后一个元素
ans =
7 8 9 10
(2)利用空矩阵来删除矩阵中的元素
空矩阵是指没有任何元素的矩阵
>> x=[]
x =
[]
>> a=[1:4;5:8]
a =
1 2 3 4
5 6 7 8
>> a(:,[2,4])=[] //注意此处是删除第二和第四列元素
a =
1 3
5 7
(3)改变矩阵的形状
reshape(A,m,n):在矩阵总元素数量保持不变的前提下,将矩阵A重新排列为m x n的二维矩阵。
注意:reshape()函数只是改变行数和列数,并没有改变矩阵元素个数和存储顺序。
>> A=[1:4;5:8]
A =
1 2 3 4
5 6 7 8
>> B=reshape(A,4,2)
B =
1 3
5 7
2 4
6 8
(4)A(:)将矩阵A的每一列元素堆叠起来,成为一个列向量。等价于reshape(A,m*n,1),A为m x n矩阵
>> A=[1:3;4:6]
A =
1 2 3
4 5 6
>> A(:)
ans =
1
4
2
5
3
6