假设我有以下功能:
function x = printAndKeepX(x, y)
x
y
end
我像这样调用bsxfun
:
bsxfun(@printAndKeepX, 1:4, 1);
bsxfun
真的是逐个元素,我希望printAndKeepX
被调用4次,参数(x, y)
为(1, 1)
,(2, 1)
,分别为(3, 1)
和(4, 1)
。但是输出显示只有(x, y)
为([1 2 3 4], 1)
时才会调用它:
x =
1 2 3 4
y =
1
为什么呢?我怎么知道什么是“元素”?
修改
The documentation表明有时被调用函数可以接收两个标量,有时也可以接收矢量/矩阵和标量。我能确定知道哪一个会发生吗?
我对bsxfun
的常规和GPU版本感兴趣。
答案 0 :(得分:4)
documentation还声明:
fun
还必须支持标量扩展,例如,如果A
或B
是标量,则C
是将标量应用于其他元素的结果输入数组。
在您的情况下,B
实际上是标量,因此您的功能仅在A
上应用一次。
当输入数组是矩阵时,同样适用。例如,考虑使用大小为 m bsxfun = { a ij }调用A
的情况>×B
= { b ij }。 B
将沿第二维复制 n 次,函数将按如下方式调用:
function([a11, ..., a1n], b1)
function([a21, ..., a2n], b2)
...
function([am1, ..., amn], bm)
这导致 n 函数调用矢量标量输入,而不是 mn 函数调用标量对。如果函数是矢量化的,则可能反映在可能显着的性能增益中。