MATLAB-1-5矩陣元素引用

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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章