Matlab Array - Indexing

MATLAB 的数组结构适于访问,修改和增提案其中元素. 数组有 Position Indexing, Linear Indexing, Logical Indexing 三种索引方式

r 对应 Python, MATLAB 中的数组都是 “可变对象”

Position Indexing

语法: A(ind_1,...,ind_n)

  • 其中 n 为数组的维数
  • ind_i 为对应维数需要访问/引用元素的索引
    • 可以为 scalar, vector
    • operator :
      • : 相当于 Python Slice
        • 若只有单独的 :, 表示取所有可以取到的元素
      • 同时多了 end 参数
    • 需要符合对应维数范围
  • 本质上填入的是一个索引数组, 访问/引用的是将索引数组对应的 A 的元素提取出来, 按原相对位置 组成的新数组

例子:

>> A = rand(3,3,3)
A(:,:,1) =
    0.8147    0.9134    0.2785
    0.9058    0.6324    0.5469
    0.1270    0.0975    0.9575
A(:,:,2) =
    0.9649    0.9572    0.1419
    0.1576    0.4854    0.4218
    0.9706    0.8003    0.9157
A(:,:,3) =
    0.7922    0.0357    0.6787
    0.9595    0.8491    0.7577
    0.6557    0.9340    0.7431
>> A(1,2,3)
ans =
    0.0357
>> A(1,1,[1 3])  
ans(:,:,1) =
    0.8147
ans(:,:,2) =
    0.7922
>> A(1,[1,3],1)      
ans =
    0.8147    0.2785
>> A(:,1,1)
ans =
    0.8147
    0.9058
    0.1270
>> A(1,1:2,1)
ans =
    0.8147    0.9134
>> A(1,1:3:2,1)
ans =
    0.8147
>> A(1,2:end,1)     
ans =
    0.9134    0.2785

Linear Indexing

同样通过位置索引, Linear Indexing 是在传递参数小于数组维数时, 将剩余维数元素并置为一维进行索引.

特别的, 此索引方法可以通过一个指标访问到所有元素.

r While MATLAB displays arrays according to their defined sizes and shapes, they are actually stored in memory as a single column of elements

剩余 (所有) 元素并置的顺序按照如下规则 (设为 2-2-2-… 数组):

  1. 1-1-1-…
  2. 2-1-1-…
  3. 1-2-1-…
  4. 2-2-1-…
  5. 1-1-2-…
  6. 2-1-2-…
  7. 1-2-2-…
  8. 2-2-2-…

特别的对于 matrix, 可简述为 “先列后行”.

例子 1:

>> B = rand(1,1,2,2,2) 
B(:,:,1,1,1) =
    0.3500
B(:,:,2,1,1) =
    0.1966
B(:,:,1,2,1) =
    0.2511
B(:,:,2,2,1) =
    0.6160
B(:,:,1,1,2) =
    0.4733
B(:,:,2,1,2) =
    0.3517
B(:,:,1,2,2) =
    0.8308
B(:,:,2,2,2) =
    0.5853
>> C=B(1,:)   
C =
    0.3500    0.1966    0.2511    0.6160    0.4733    0.3517    0.8308    0.5853

例子 2:

>> A = rand(3,3,3)
A(:,:,1) =
    0.8147    0.9134    0.2785
    0.9058    0.6324    0.5469
    0.1270    0.0975    0.9575
A(:,:,2) =
    0.9649    0.9572    0.1419
    0.1576    0.4854    0.4218
    0.9706    0.8003    0.9157
A(:,:,3) =
    0.7922    0.0357    0.6787
    0.9595    0.8491    0.7577
    0.6557    0.9340    0.7431
>> A(4)  
ans =
    0.9134
>> A(10)
ans =
    0.9649

相关函数

Logical Indexing

通过条件表达式可以返回一个跟原数组同样大小的逻辑值数组; 同样的与被索引数组大小相同的逻辑值数组可以作为其 logical index.

例子:

>> A = rand(3)
A =
    0.5497    0.7572    0.5678
    0.9172    0.7537    0.0759
    0.2858    0.3804    0.0540
>> ind = A > 0.5
ind =
  3x3 logical array
   1   1   1
   1   1   0
   0   0   0
>> A(ind) = nan
A =
       NaN       NaN       NaN
       NaN       NaN    0.0759
    0.2858    0.3804    0.0540