Matlab:奇怪的线性索引到具有单一维度的数组中

时间:2018-04-04 22:14:34

标签: matlab indexing

我无法理解线性索引适用的环境。

对于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矩阵完全相同。

是否有可依赖的规则来预测线性索引的行为?

1 个答案:

答案 0 :(得分:4)

数组x的数组ind线性索引规则如下(取自this great post by Loren Shure):

  • 如果xind中至少有一个不是向量(即xind有多个非单一维度)输出具有与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
    
  • 如果xind都是向量,则输出是一个与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