矩陣元素引用
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