逐元素相乘 .* 向量在 Matlab 中给出矩阵
Element-wise mutiplication .* of vectors gives matrix in Matlab
给定两个向量
a = 1:3;
b = 2:4;
众所周知,元素乘法 a.*b
产生
[ 2 6 12 ]
调用该结果 c
,我们有 c(i) = a(i)*b(i)
但我不明白a.*b'
、b'.*a
和b'*a
是如何产生
的
[ 2 4 6
3 6 9
4 8 12 ]
对于矩阵乘法b'*a
,我们知道c(i,j) = b(i)*a(j)
。
但为什么其他两个也产生相同的结果?
你举的例子都是逐元素乘法。
a.*b'
在早期的 matlab 中会报错,而它执行
bsxfun(@times, a, b')
自 R2016b 起在 Matlab 中。这应该可以解释 a.*b'
、b'.*a
和 b'*a
.
的相同结果
a * b'
将是矩阵乘法(内维匹配)。
由于隐式扩展 (introduced in 2016b),它与使用 bsxfun
基本相同。
但这是什么意思?
设置:
a = 1:3;
b = 2:4;
所有 MATLAB 版本:
c = a.*b;
% c = [2 6 12], element-wise multiplication c(j) = a(j)*b(j)
c = b'*a;
% c = [2 4 5; 3 6 9; 4 8 12]
% standard matrix multiplication of vectors
% c(i,j) = a(i) + b(j)
c = bsxfun(@times, b', a)
% c = [2 4 5; 3 6 9; 4 8 12]
% bsxfun applies the function (in this case @times) to b' and a
根据定义,bsxfun
"applies the element-by-element binary operation specified by the function handle fun to arrays A and B, with singleton expansion enabled"。这意味着单例维度(大小为 1 的维度)被扩展 row-wise/column-wise 以匹配提供给 bsxfun
.
的另一个参数的大小
所以,bsxfun(@times, b', a)
等价于
% b' in singleton in the 2nd dimension, a is singleton in the 1st dimension
% Use repmat to perform the expansion to the correct size
repmat(b', 1, size(a,2)) .* repmat(a, size(b',1), 1)
% Equivalent to...
repmat(b', 1, 3) .* repmat(a, 3, 1)
% Equivalent to...
[2 2 2; 3 3 3; 4 4 4] .* [1 2 3; 1 2 3; 1 2 3]
% = [2 4 5; 3 6 9; 4 8 12] the same as b'*a
R2016b 之前
c = a.*b'; % Error: Matrix dimensions must agree.
c = b'.*a; % Error: Matrix dimensions must agree.
从 R2016b 开始
较新的 MATLAB 版本使用隐式扩展,这基本上意味着如果需要进行有效操作,bsxfun
等效项将被调用 'under the hood'。
c = a.*b'; % [2 4 5; 3 6 9; 4 8 12] the same as bsxfun(@times, a, b')
c = b'.*a; % [2 4 5; 3 6 9; 4 8 12] the same as bsxfun(@times, b', a)
% These two are equivalent also because order of operations is irrelevant
% We can see this by thinking about the expansion discussed above
正如您所注意到的,如果您不跟踪矢量方向,这可能会造成混淆!如果你想获得一维输出(不扩展),那么你可以确保你的输入是一维 列向量 通过使用像这样的冒号运算符
c = a(:).*b(:); % c = [2; 6; 12] always a column vector
给定两个向量
a = 1:3;
b = 2:4;
众所周知,元素乘法 a.*b
产生
[ 2 6 12 ]
调用该结果 c
,我们有 c(i) = a(i)*b(i)
但我不明白a.*b'
、b'.*a
和b'*a
是如何产生
[ 2 4 6
3 6 9
4 8 12 ]
对于矩阵乘法b'*a
,我们知道c(i,j) = b(i)*a(j)
。
但为什么其他两个也产生相同的结果?
你举的例子都是逐元素乘法。
a.*b'
在早期的 matlab 中会报错,而它执行
bsxfun(@times, a, b')
自 R2016b 起在 Matlab 中。这应该可以解释 a.*b'
、b'.*a
和 b'*a
.
a * b'
将是矩阵乘法(内维匹配)。
由于隐式扩展 (introduced in 2016b),它与使用 bsxfun
基本相同。
但这是什么意思?
设置:
a = 1:3;
b = 2:4;
所有 MATLAB 版本:
c = a.*b; % c = [2 6 12], element-wise multiplication c(j) = a(j)*b(j) c = b'*a; % c = [2 4 5; 3 6 9; 4 8 12] % standard matrix multiplication of vectors % c(i,j) = a(i) + b(j) c = bsxfun(@times, b', a) % c = [2 4 5; 3 6 9; 4 8 12] % bsxfun applies the function (in this case @times) to b' and a
根据定义,
的另一个参数的大小bsxfun
"applies the element-by-element binary operation specified by the function handle fun to arrays A and B, with singleton expansion enabled"。这意味着单例维度(大小为 1 的维度)被扩展 row-wise/column-wise 以匹配提供给bsxfun
.所以,
bsxfun(@times, b', a)
等价于% b' in singleton in the 2nd dimension, a is singleton in the 1st dimension % Use repmat to perform the expansion to the correct size repmat(b', 1, size(a,2)) .* repmat(a, size(b',1), 1) % Equivalent to... repmat(b', 1, 3) .* repmat(a, 3, 1) % Equivalent to... [2 2 2; 3 3 3; 4 4 4] .* [1 2 3; 1 2 3; 1 2 3] % = [2 4 5; 3 6 9; 4 8 12] the same as b'*a
R2016b 之前
c = a.*b'; % Error: Matrix dimensions must agree. c = b'.*a; % Error: Matrix dimensions must agree.
从 R2016b 开始
较新的 MATLAB 版本使用隐式扩展,这基本上意味着如果需要进行有效操作,
bsxfun
等效项将被调用 'under the hood'。c = a.*b'; % [2 4 5; 3 6 9; 4 8 12] the same as bsxfun(@times, a, b') c = b'.*a; % [2 4 5; 3 6 9; 4 8 12] the same as bsxfun(@times, b', a) % These two are equivalent also because order of operations is irrelevant % We can see this by thinking about the expansion discussed above
正如您所注意到的,如果您不跟踪矢量方向,这可能会造成混淆!如果你想获得一维输出(不扩展),那么你可以确保你的输入是一维 列向量 通过使用像这样的冒号运算符
c = a(:).*b(:); % c = [2; 6; 12] always a column vector