Matlab:单件维数组的奇线性索引

Matlab:单件维数组的奇线性索引,matlab,indexing,Matlab,Indexing,我很难理解线性索引在什么情况下适用 对于二维阵列,这似乎很直观: >> clear x >> x=[1 2;3 4] x = 1 2 3 4 >> x([1 2]) ans = 1 3 >> x([1;2]) ans = 1 3 >> clear y >> y(1:2,1:2,1)=x y = 1 2 3 4 &g

我很难理解线性索引在什么情况下适用

对于二维阵列,这似乎很直观:

>> clear x
>> x=[1 2;3 4]
x =
     1     2
     3     4
>> x([1 2])
ans =
     1     3
>> x([1;2])
ans =
     1
     3
>> 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 x
>> x=[1 2;3 4]
x =
     1     2
     3     4
>> x([1 2])
ans =
     1     3
>> x([1;2])
ans =
     1
     3
>> 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矩阵完全相同


是否有一条规则可以用来预测线性索引的行为?

使用数组
ind
的数组
x
线性索引规则如下(摘自):

  • 如果
    x
    ind
    中至少有一个不是向量(即,如果
    x
    ind
    具有多个非单态维度),则输出具有与
    ind
    相同的形状(大小):

    >> 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 = 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
    ind
    都是向量,则输出是一个与
    x
    方向相同的向量(即非单态的输出维度是
    x
    中的维度),并且元素数与
    ind
    相同:

    >> 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 = 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

另一个关于MATLAB中基于单体维度的不一致性的好例子。若你们不确定你们的输入并没有单态维度,你们就不能指望输出的形状。与
max
sum
以及所有在列上工作的函数相同,除非第一个维度是singleton,那么它在行上工作:(作为一个编写了多个版本的
max
sum
的人,我感觉到了你的痛苦。但是,所有的缩减函数都支持显式的维度参数,让你完全获得编程行为。@CrisLuengo IMO它并不矛盾-它在第一个非单例维度上工作,这使得f如果你经常考虑,你会有行或列向量,你显然想要的是所有元素的总和。。另一件事是,max和sum都将最终矩阵维数减少了1。对已存在的单体维数进行操作无法实现这一点。但是,是的,您需要始终使用max(A(:)或max(A,dim);普通的旧max(A)肯定会出问题。@ZizyArcher:我理解推理,我也理解解决方法。但这仍然是用户错误的原因。这些不一致的真正原因是MATLAB没有真向量,总是至少有2维。向量和具有单一维度的矩阵不应该是一回事。@Luis Mendo:非常感谢。当你添加关于非线性索引的内容时,我的大脑开始痛了,所以我会把它留到另一个懒洋洋的星期天在咖啡馆里。顺便说一句,x=10:10:7;应该是
x=10:10:70;