How does bsxfun actually work ?
古いコメントを表示
I tried to multiply two matrices using bsxfun. Here is a sample code.
a = [0,1];
b = [1,2];
q = bsxfun(@times, a, b);
Once I run this code, I get the output
[0 2]
So I tried the following combinations
q1 = bsxfun(@times, a, b');
q2 = bsxfun(@times, a', b);
q3 = bsxfun(@times, a', b');
and all gave me a valid output and none of these generate a multiplication error.
The help says the function uses "singleton expansion" which, I suppose, means it inserts a singleton dimension in either of the two matrices to make the multiplication possible.
Can someone explain what exactly "singleton expansion" means and how is it used in this function?
採用された回答
その他の回答 (1 件)
From the release notes (about implicit expansion, introduced in R2016b, replacing most use cases for bsxfun):
Implicit expansion is a generalization of scalar expansion. With scalar expansion,
a scalar expands to be the same size as another array to facilitate element-wise operations.
With implicit expansion, the element-wise operators and functions listed here can implicitly expand
their inputs to be the same size, as long as the arrays have compatible sizes. Two arrays have
compatible sizes if, for every dimension, the dimension sizes of the inputs are either
the same or one of them is 1.
The point is illustrated by your example. In the case of q1 and q2 the input sizes don't match, so Matlab replicates the vectors to match the needed size.
%starting with this:
a.*b'
%substitute actual vectors:
[0,1].*[1;2]
%expand to match sizes:
[0,1;0,1].*[1,1;2,2]
%result:
[0,1;0,2]
%(equivalent to this:)
%repmat(a, size(b',1), 1).*repmat(b', 1, size(a,2))
1 件のコメント
Shounak Shastri
2018 年 2 月 15 日
編集済み: Shounak Shastri
2018 年 2 月 15 日
カテゴリ
ヘルプ センター および File Exchange で Linear Algebra についてさらに検索
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!