我有Xtrain
(m x d
)矩阵,Y
(m x 1
)向量,我希望第i
行Xtrain
为Y(i)
乘以X = zeros(m,d);
for i = 1 : m
X(i,:) = Xtrain(i, :) * Y(i);
end
。
我用for循环做了,但我确信有更有效的方式。
{{1}}
答案 0 :(得分:4)
使用bsxfun
:
%dummy input
m=5;
d=3;
Xtrain = rand(m,d);
Y = rand(m,1);
X2 = bsxfun(@times,Xtrain,Y); %is of size [m,d]
%compare to original
X = zeros(m,d);
for ii = 1 : m %don't use i as a variable in matlab '
X(ii,:) = Xtrain(ii, :) * Y(ii);
end
all(X(:)==X2(:)) %returns 1
bsxfun
指的是函数的“二进制单例扩展”,在我们的例子中是乘法的二元函数times
。单例扩展意味着复制一个数组的单个维度以匹配另一个数据的相应维度:[m,d]
数组与[m,1]
数组相乘,其方式与Y
的值相同用于输出的每一列。这正是您所需要的。