在 Octave 中为多个输出调用矢量化操作

Calling a vectorized operation in Octave for multiple output

我想对某些数据进行矢量化 ifelse/merge 操作。为了避免不必要的比较,我想通过只调用一次 ifelse 命令来获得结果。这是我的示例代码:

aaa = [90 80 70 60];
bbb = [10 15 20 30];
ccc = [ 0  3  6  9];
res = ifelse(ccc > 5, {[aaa bbb]}, {[aaa*-1 bbb*-1]})

因为我可以 运行 带有元胞数组的 ifelse 命令,所以我得到如下重复结果:

{
  [1,1] = -90  -80  -70  -60  -10  -15  -20  -30
  [1,2] = -90  -80  -70  -60  -10  -15  -20  -30
  [1,3] =  90   80   70   60   10   15   20   30
  [1,4] =  90   80   70   60   10   15   20   30
}

然而,我想要的 ifelse 命令的结果如下:

[-90 -80 70 60]
[-10 -15 20 30]

其实我调用ifelse命令两次就可以了,如下:

res1 = ifelse(ccc > 5, aaa, aaa*-1)
res2 = ifelse(ccc > 5, bbb, bbb*-1)

但是,我不想调用它两次,因为两者的掩码是相同的。那么,是否有办法在 Octave 或 Matlab 中调用一次 ifelse 命令来获得此结果?

您可以将掩码定义为匿名函数并使用 bsxfun:

应用它
mask = @(x, y) ifelse(y > 5, x, x*-1);
bsxfun(mask, [aaa; bbb], ccc)

输出:

ans =

  -90  -80   70   60
  -10  -15   20   30