【问题标题】:Calling a vectorized operation in Octave for multiple output在 Octave 中为多个输出调用矢量化操作
【发布时间】:2021-03-10 20:17:59
【问题描述】:

我想对一些数据进行矢量化 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 命令来获得此结果?

【问题讨论】:

    标签: matlab if-statement merge vectorization octave


    【解决方案1】:

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

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

    输出:

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

    【讨论】:

    • 如果我需要对aaa和bbb进行不同的操作怎么办?我的意思是,在这种情况下,如何将 aaa 乘以 -1,将 bbb 乘以 -2?
    • 我找到了方法。当我如下更新 bsxfun 输出的掩码和格式时,我还可以对 aaa 和 bbb 运行不同的操作: mask = @(x, y) ifelse (y > 5, {x(1); x(2)}, {x(1)*-1; x(2)*-2}); res = cell2mat(bsxfun(mask, [aaa; bbb], ccc));
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-08
    • 1970-01-01
    相关资源
    最近更新 更多