矩阵元素引用
1. 引用方式
1)通过下标引用矩阵元素
下标必须为正整数,用圆括号括起
A(3,2) %A矩阵第3行第2列元素
>> 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
%若给出的行下标或列下标大于原来矩阵的行数和列数,那么Matlab将自动扩展原来的矩阵,并将扩展后没有赋值的矩阵元素置为0。
2)通过序号引用矩阵元素
- Matlab中,矩阵元素按列存储,首先存储矩阵的第一列元素,然后存储第二列,…,一直到矩阵的最后一列元素。
- 矩阵元素的序号就是矩阵元素在内存中的排列顺序。
>> A=[1,2,3;4,5,6]
A =
1 2 3
4 5 6
>> A(3)
ans =
2
%在内存中的排列顺序,首先存储矩阵的第一列元素,然后存储第2列元素……序号与下标一一对应,以m×m矩阵A为例,矩阵元素A(i,j)的序号为(j-1)×m+i。
3)矩阵元素序号与下标相互转换
i. sub2ind( )函数
将矩阵中指定元素的行、列下标转换成存储的序号。
调用格式: D=sub2ind(S,I,J)
D:对应下标元素的序号,行列数与I,J相同
S:矩阵的行数和列数组成的向量,可通过*size( )*获得
I:转换矩阵元素的行下标
J:转换矩阵元素的列下标
- 若I,J为矩阵,表示要将矩阵中的多个元素的行列下标转换成存储的序号,那么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
%注意输出D的格式,为2×2的矩阵,其元素对应[1,2;2,2],[1,1;3,2]相应位置上元素。
ii. ind2sub( )函数
将矩阵元素的序号转换成对应的下标
调用格式: [I,J]=ind2sub(S,D)
S:矩阵的行数和列数组成的向量,由行数和列数组成的,有两个元素的向量
D:序号
I:对应元素的行下标
J:对应元素的列下标
>> [I,J]=ind2sub([3,3],[1,3,5])
I =
1 3 2
J =
1 1 2
>> class(I)
ans =
'double'
>> class([I,J])
ans =
'double'
>> class([3,3])
ans =
'double'
%求3×3矩阵的第1,3,5个元素的下标
2. 获取子矩阵方式
1)通过冒号表达式获得子矩阵
- 冒号表达式作为引用矩阵的下标,也可以直接用单个的冒号作为行下标或列下标。
- 用单个的冒号作为行下标或列下标,代表全部行或全部列
- A(i,:) %第i行的全部元素
A(:,j) %第j列的全部元素
A(i:i+m,k:k+m) %第i ~ i+m行内且在第k~k+m列中的所有元素
A(i:i+m,:) %第i~i+m行的全部元素
>> A=[1,2,3,4,5;6,7,8,9,10;11,12,13,14,15]
A =
1 2 3 4 5
6 7 8 9 10
11 12 13 14 15
>> A(:,1)
ans =
1
6
11
>> A(1,:)
ans =
1 2 3 4 5
>> A(1:3,:)
ans =
1 2 3 4 5
6 7 8 9 10
11 12 13 14 15
>> A(1:,3)
A(1:,3)
↑
错误: 表达式无效。调用函数或对变量进行索引时,请使用圆括号。否则,请检查不匹配的分隔符。
>> A(1:2,3)
ans =
3
8
>> A(1:2,3:5)
ans =
3 4 5
8 9 10
%冒号的使用:冒号两边要么都要有数字,要么都没有数字,不能只有一边有数字
- 将矩阵A的每一列元素堆叠起来,成为一个列向量A( : )
>> A=[1,2,3;6,7,8]
A =
1 2 3
6 7 8
>> B=A(:)
B =
1
6
2
7
3
8
>> C=reshape(A,6,1)
C =
1
6
2
7
3
8
%A(:)等价于reshape(A,6,1)
2)通过end运算符获得子矩阵
end:某一维的末尾元素下标
>> A=[1,2,3,4,5;6,7,8,9,10;11,12,13,14,15]
A =
1 2 3 4 5
6 7 8 9 10
11 12 13 14 15
>> A(end,:)
ans =
11 12 13 14 15
>> A([1,2],4:end)
ans =
4 5
9 10
3)表示向量的倒数第2个元素:end-1
>> x=[1:4]
x =
1 2 3 4
>> x(end-1)
ans =
3
3. 利用空矩阵删除矩阵元素
空矩阵:没有任何元素的矩阵,在建立矩阵时,中括号中为空。直接将要删除的元素值置为空矩阵
>> x=[]
x =
[]
%x为一个空矩阵
>> A
A =
1 2 3 4 5
6 7 8 9 10
11 12 13 14 15
>> A(:,[2,4])=[]
A =
1 3 5
6 8 10
11 13 15
%删除第2列和第4列元素。当表示不连续的多列时,用中括号括起。
列元素位置上,用中括号括起,表示不连续的列。
4. 改变矩阵形状:reshape( )
在矩阵总元素不变的情况下,改变矩阵形状,即改变矩阵行数和列数。
语法: reshape(A,m,n)
- 将矩阵A重新排成m×n的二维矩阵
- 只改变原矩阵的行数和列数,不改变原矩阵元素个数及其存储顺序。
>> A
A =
1 3 5
6 8 10
11 13 15
>> reshape(A,1,9)
ans =
1 6 11 3 8 13 5 10 15
>> reshape(A,9,1)
ans =
1
6
11
3
8
13
5
10
15
%注意:reshape( )函数不改变存储顺序
5. 说出x1、x2、x3的区别,并上机验证结论。
x1,x2,x3均为空矩阵,但x1,x3行数列数确定,x2行数列数不确定。
>> x=[1:4;4,3,5,8];
>> x1=x(2:1)
x1 =
空的 1×0 double 行向量
>> x2=[]
x2 =
[]
>> x3=2:1
x3 =
空的 1×0 double 行向量
>> [isempty(x),isempty(x1),isempty(x2),isempty(x3)]
%isempty( )判断数组是否为空,为空则返回1,否则返回0
ans =
1×4 logical 数组
0 1 1 1
>> [size(x),size(x1),size(x2),size(x3)]
%size( )获取数组的维数
ans =
2 4 1 0 0 0 1 0