bsxfun真的应用于元素吗?

时间:2013-08-06 12:02:13

标签: matlab bsxfun

假设我有以下功能:

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版本感兴趣。

1 个答案:

答案 0 :(得分:4)

documentation还声明:

  

fun还必须支持标量扩展,例如,如果AB是标量,则C是将标量应用于其他元素的结果输入数组。

在您的情况下,B实际上是标量,因此您的功能仅在A上应用一次。

当输入数组是矩阵时,同样适用。例如,考虑使用大小为 m bsxfun = { a ij }调用A的情况>× n 和大小 m ×1的向量B = { b ij }。 B将沿第二维复制 n 次,函数将按如下方式调用:

  

function([a11, ..., a1n], b1)
  function([a21, ..., a2n], b2)
  ...
  function([am1, ..., amn], bm)

这导致 n 函数调用矢量标量输入,而不是 mn 函数调用标量对。如果函数是矢量化的,则可能反映在可能显着的性能增益中。