我无法理解线性索引适用的环境。
对于2D数组,它看起来很直观:
>> clear x
>> x=[1 2;3 4]
x =
1 2
3 4
>> x([1 2])
ans =
1 3
>> x([1;2])
ans =
1
3
对于3D矩阵,它看起来很直观:
>> clear y
>> y(1:2,1:2,1)=x
y =
1 2
3 4
>> y(1:2,1:2,2)=x+10
y(:,:,1) =
1 2
3 4
y(:,:,2) =
11 12
13 14
>> y([1 2])
ans =
1 3
>> y([1;2])
ans =
1
3
对于前两个维度是单例的3D矩阵,它不是我所期望的:
>> clear y
>> y(1,1,1)=1
y =
1
>> y(1,1,2)=2
y(:,:,1) =
1
y(:,:,2) =
2
>> y([1 2])
ans(:,:,1) =
1
ans(:,:,2) =
2
>> y([1;2])
ans(:,:,1) =
1
ans(:,:,2) =
2
我原本期望与没有单一尺寸的3D矩阵完全相同。
是否有可依赖的规则来预测线性索引的行为?
答案 0 :(得分:4)
数组x
的数组ind
的线性索引规则如下(取自this great post by Loren Shure):
如果x
和ind
中至少有一个不是向量(即x
或ind
有多个非单一维度)输出具有与ind
相同的形状( size ):
>> x = rand(3,4);
>> ind = [9 3];
>> x(ind)
ans =
0.276922984960890 0.743132468124916
>> x(ind.')
ans =
0.276922984960890
0.743132468124916
>> x = rand(2,3,4);
>> ind = [1 2; 5 6];
>> x(ind)
ans =
0.814723686393179 0.905791937075619
0.632359246225410 0.097540404999410
如果x
和ind
都是向量,则输出是一个与x
具有相同方向的向量(即输出维度)非单身人士是x
),而数量的是ind
:
>> x = 10:10:70;
>> ind = [1 3 5];
>> x(ind)
ans =
10 30 50
>> x(ind.')
ans =
10 30 50
>> x = reshape(10:10:70,1,1,[]); % 1×1×7
>> ind = reshape([2 3 4],1,1,1,1,[]); % 1×1×1×1×3
>> x(ind)
ans(:,:,1) =
20
ans(:,:,2) =
30
ans(:,:,3) =
40
为了完整性,如果应用了两个或更多索引数组(因此这不再是线性索引),则输出的形状由维确定原始数组正在被索引,并且每个索引数组的元素数。它与索引数组的形状无关,只需像往常一样在列主要顺序中读取:
>> x = [10 20 30 40; 50 60 70 80];
>> x(2, [1 2; 3 4])
ans =
50 70 60 80
>> x(2, [1 2 3 4])
ans =
50 60 70 80
>> x(2, reshape([1 2 3 4],1,1,1,[]))
ans =
50 60 70 80
如果索引的数量少于x
的维数,则x
的尾随维度会在应用索引之前隐式折叠为一个:
>> x = [10 20 30 40; 50 60 70 80];
>> x(:,:,2) = x+100;
>> x([1 2], [1; 5; 7; 8])
ans =
10 110 130 140
50 150 170 180