逻辑索引创建行而不是列

时间:2017-08-18 11:26:57

标签: matlab indexing

我无法理解我刚刚发现的Matlab的行为。这是代码:

ix = logical([1; 0; 1]);
value = [2; 2; 2];
newValue(ix) = value(ix)

输出

2 0 2

虽然我期待

2
0
2

我可以通过在我的代码之前添加newValue = nan(size(value))来“纠正”它。但我想了解为什么 Matlab从列向量创建一行。

2 个答案:

答案 0 :(得分:4)

它会执行此操作,因为当您使用索引创建数组时:a(1) = 2; a(2) = 3;,Matlab(和Octave)会创建一行(a=[2, 3])。当您使用逻辑索引时,它使用此方法。在你的情况下,Matlab执行

newValue(1) = value(1); 
newValue(3) = value(3);

但正如@Irreducible所说,你可以通过预先分配newValue来避免这种情况

您可以在不使用逻辑索引的情况下获得相同的结果:

ix = [1; 0; 1];
value = [2; 2; 2];
newValue = value.*ix;

答案 1 :(得分:3)

我不认为它与逻辑索引有任何关系。您可以使用

重现相同的行为
ix=[1;2;3]
value = [2; 2; 2];
newValue(ix)=value(ix)

newValue =

 2     2     2

我假设默认格式(newValue)是一行,这就是你得到这个结果的原因(如你创建x = 1:3就可以看到)。

x=1:3;
x =

 1     2     3

通过预先分配newValue,你可以克服这一点。

newValue=zeros(size(value));

或通过后期处理

newValue=newValue(:);