在 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
我想对某些数据进行矢量化 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