Suppose that I have the following function:
function x = printAndKeepX(x, y)
x
y
end
and I invoke bsxfun
like so:
bsxfun(@printAndKeepX, 1:4, 1);
Were bsxfun
really element-by-element, I would expect printAndKeepX
to be called 4 times, with the arguments (x, y)
being (1, 1)
, (2, 1)
, (3, 1)
and (4, 1)
, respectively. But the output shows that it is called just once with (x, y)
being ([1 2 3 4], 1)
:
x =
1 2 3 4
y =
1
Why? How can I know what's considered an "element"?
Edit:
The documentation suggests that sometimes the called function can receive two scalars and sometimes a vector/matrix and a scalar. Can I know for sure which of these is going to happen?
I'm interested in both the regular and GPU versions of bsxfun
.
The documentation also states that:
In your case
B
is in fact a scalar, so your function is applied onA
only once.The same applies when the input arrays are matrices. For example, consider a case where
bsxfun
is invoked with a matrixA
={ aij } of size m×n and a vectorB
={ bij } of size m×1.B
would be replicated n times along the second dimension, and the function would be called as follows:This results in n function calls for vector-scalar inputs rather then mn function calls for pairs of scalars. If the function is vectorized, it may be reflected in a possibly significant performance gain.