MATLAB矩阵的表示
矩阵是MATLAB最基本的数据对象,MATLAB的大部分运算或命令都是在矩阵运算的意 义下执行的。在MATLAB中,不需要对矩阵的维数、大小和类型进行说明,MATLAB 会根据 用户所输入的内容自动进行配置。
一、矩阵的建立
1.利用直接输入法建立矩阵
最简单的建立矩阵的方法是从键盘直接输入矩阵的元素。
具体方法是,将矩阵的元素用中括号括起来,按矩阵行的顺序输入各元素,同一行的各元素之间用逗号或空格分隔,不同行的元素之间用分号分隔。例如:
>>A=[1,2,3;4,5,6;7,8,9]
A =
1 2 3
4 5 6
7 8 9
又如,建立复数矩阵:
>> B=[2+3i,5;3-5j,6j]
B =
2.0000 + 3.0000i 5.0000 + 0.0000i
3.0000 - 5.0000i 0.0000 + 6.0000i
2.利用已建好的矩阵建立更大的矩阵
大矩阵可由已建好的小矩阵拼接而成。
例如:
>>A=[1,2,3;4,5,6;7,8,9];
>>B=[-1,-2,-3;-4,-5,-6;-7,-8,-9];
>>C=[A,B;B,A]
C =
1 2 3 -1 -2 -3
4 5 6 -4 -5 -6
7 8 9 -7 -8 -9
-1 -2 -3 1 2 3
-4 -5 -6 4 5 6
-7 -8 -9 7 8 9
二、冒号表达式
在MATLAB 中,利用冒号表达式可以产生行向量,一般格式如下:
e1:e2:e3
其中,e1为初始值,e2 为步长,e3 为终止值。
冒号表达式可以产生一个由e1开始到e3 结束, 以步长e2 自增的行向量。例如:
>> t=0:1:5
t =
0 1 2 3 4 5
在冒号表达式中如果省略e2不写,则步长为1。例如,t=0:5与t=0:1:5等价。
在MATLAB中,还可以用**linspace**函数产生行向量,其调用格式如下:
linspace(a,b,n)
其中,a 和b 是生成向量的第1个和最后一个元素,n 是元素总数。当n省略时,自动产生100 个元素。
三、矩阵元素的引用
1.矩阵元素的引用方式
在很多情况下,需要对矩阵的单个元素进行操作。
矩阵元素可以通过下标(Subscript)来引用,下标必须为正整数。例如,A(3,2)表示A 矩阵第3行第2列的元素,如果要将该元素赋 为200,则可以通过下面的命令来完成:
>>A(3,2)=200
这时将只改变该元素的值,而不影响其他元素的值。
如果给出的行下标或列下标大于原来矩阵的行数和列数★,则MATLAB将自动扩展原来的矩阵,并将扩展后未赋值的矩阵元素置为0。 例如:
>> A=[1,2,3;4,5,6];
>> A(4,5)=10
A =
1 2 3 0 0
4 5 6 0 0
0 0 0 0 0
0 0 0 0 10
也可以采用矩阵元素的序号(Index) 来引用矩阵元素。矩阵元素的序号就是相应元素在内 存中的排列顺序,即线性索引号。
在 MATLAB 中,矩阵元素按列存储★,即首先存储矩阵的第 一列元素,然后存储第二列元素, ……,一直到矩阵的最后一列元素。
>> A=[1,2,3;4,5,6];
>> A(3)
ans =
2
显然,序号与下标是一一对应的,以m×n 矩 阵A 为 例,*矩阵元素A(i,j)的序号为(j-1)m+i。
矩阵元素的序号与下标可以利用 sub2ind 和 ind2sub 函数实现相互转换。
sub2ind 函数将矩阵中指定元素的行、列下标转换成存储的序号,其调用格式如下:
D=sub2ind(S,I,J)
其中,S 表示要转换的矩阵的行数和列数,是行数和列数组成的向量,通常用size 函数获取;I 是要转换矩阵的行下标,J 是要转换矩阵的列标。I 、J 的行列数必须相同。D 为对应下标元素的序号,其行列数与I 、J 相同。例如:
>> A=[1:3;4:6]
A =
1 2 3
4 5 6
>> D=sub2ind(size(A),[1,2;2,2],[1,1;3,2])
D =
1 2
6 4
命令中的size(A)函数返回包含两个元素的向量,分别是A 矩阵的行数和列数。从执行结果 可以看出,A(1,1)的序号为1,A(2,1)的序号为2,A(2,3)的序号6,A(2,2)的序号为4。
ind2sub 函数用于把矩阵元素的序号转换成对应的下标,其调用格式如下:
[I,J]=ind2sub(S,D)
其中,S 表示要转换的矩阵的行数和列数;D 是序号,返回值为序号所对应元素的行下标和列下标。例如:
>> [I,J]=ind2sub([3,3],[1,3,5])
I =
1 3 2
J =
1 1 2
命令执行结果表明,3×3矩阵的第1、3、5个元素的下标分别为(1,1)、(3,1)、(2,2)。
有关求矩阵大小的函数还有length(A), 给出矩阵A 最长维的长度;ndims(A), 给出矩阵A 的维数;numel(A), 给出矩阵A 元素的个数。
2.利用冒号表达式获得子矩阵★
子矩阵是指由矩阵中的一部分元素构成的矩阵。若用冒号表达式作为引用矩阵时的下标, 这时就可以获得一个子矩阵。
也可以直接用单个的冒号来作为行下标或列下标,它代表全部行或全部列。
例如,A(i,j)表示A 矩阵第i 行、第j 列的元素,A(i,:)表示A矩阵第i 行的全部元素,A(:,j)表示A矩阵第j 列的全部元素。
同样,A(i:i+m,k:k+m)表示 A 矩阵第 i~i+m 行内且在第 k~k+m 列中的所有元素,
A(i:i+m,:)表示A 矩阵第i~i+m行的全部元素,
A(:,k:k+m) 表示A 矩 阵 第k~k+m 列的全部元素。
>> A=[1,2,3,4,5;6,7,8,9,10;11,12,13,14,15;16,17,18,19,20]
A =
1 2 3 4 5
6 7 8 9 10
11 12 13 14 15
16 17 18 19 20
>> A(1,:)
ans =
1 2 3 4 5
>> A(:,2:4)
ans =
2 3 4
7 8 9
12 13 14
17 18 19
>> A(2:3,4:5)
ans =
9 10
14 15
>> A(2:3,1:3:5)
ans =
6 9
11 14
>> A(2:3,[1 3 5])
ans =
6 8 10
11 13 15
还可以利用一般向量和end 运算符来表示矩阵下标,从而获得子矩阵。end 表示某一维的末尾元素下标。
>> A=[1,2,3,4,5;6,7,8,9,10;11,12,13,14,15;16,17,18,19,20];
>> A(end,:)
ans =
16 17 18 19 20
四、利用空矩阵删除矩阵的元素★
空矩阵是指没有任何元素的矩阵,即在建立矩阵时,中括号中为空。例如:
X=[]
将某些元素从矩阵中删除,采用将其置为空矩阵的方法是一种有效的方法。
>> A=[1,2,3,0,0;7,0,9,2,6;1,4,-1,1,8]
A =
1 2 3 0 0
7 0 9 2 6
1 4 -1 1 8
>> A(:,[2,4])=[]
A =
1 3 0
7 9 6
1 -1 8
五、改变矩阵的形状
reshape(A,m,n) 函数在矩阵总元素保持不变的前提下,将矩阵A 重新排成m×n 的二维矩阵。
注意:reshape 函数只是改变原矩阵的行数和列数,即改变其逻辑结构,但并不改变原矩阵元素个数及其存储顺序。
A( : ) 将矩阵A 的每一列元素堆叠起来,成为一个列向量,从而改变了矩阵的形状。
>> x=[23,45,65,34,65,34,98,45,78,65,43,76];
>> y=reshape(x,3,4)
y =
23 34 98 65
45 65 45 43
65 34 78 76
>> z=reshape(y,2,6)
z =
23 65 65 98 78 43
45 34 34 45 65 76
>> B=A(:)
B =
1
7
1
3
9
-1
0
6
8
在这里, A(:) 产生一个6×1的矩阵,等价于 reshape(A,6,1)。