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.2785Linear 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-…
- 2-1-1-…
- 1-2-1-…
- 2-2-1-…
- 1-1-2-…
- 2-1-2-…
- 1-2-2-…
- 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相关函数
- 可用 sum 函数直接求 matrix 所有元素之和:
sum(A(:)) - sub2ind, ind2sub
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