【问题标题】:Logical indexing creates row instead of column逻辑索引创建行而不是列
【发布时间】:2017-08-18 11:26:56
【问题描述】:

我无法理解我刚刚发现的 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 从列向量创建一行。

【问题讨论】:

  • 我也不知道为什么,但是你可以使用newValue(ix,:) = value(ix) 得到你想要的结果(如果newValue 不存在,否则你应该像你一样初始化它)。
  • @Zep,问题是我希望我的函数的输出具有与输入相同的维度(例如内置的sin)。但是,如上所述,如果没有预分配,它就不起作用。它不起作用的事实表明我错过了关于 Matlab 中尺寸的一些基本知识。所以它让我困惑,从第一原则:)
  • 我认为@Théo P. 回答了你:Matlab 默认创建行。如果您想要一列,请预先分配或在索引中指定它 (newValue(ix,:))。

标签: matlab indexing


【解决方案1】:

我认为它与逻辑索引无关。您可以使用

重现相同的行为
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(:);

【讨论】:

    【解决方案2】:

    这样做是因为当您使用索引创建数组时: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;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-07-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多