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