我想将M×N矩阵的每一列乘以大小为N的向量的相应元素。
我知道可以使用for循环。但我正在寻求一种更简单的方法。
答案 0 :(得分:4)
我认为这就是你想要的:
mat1=randi(10,[4 5]);
vec1=randi(10,[1 5]);
result=mat1.*repmat(vec1,[size(mat1,1),1]);
rempat
会沿vec1
行复制mat1
。然后我们可以进行逐元素乘法(.*)
以“将M × N
矩阵的每一列乘以大小为N
的向量的相应元素”。
编辑:只是添加到计算方面。我希望您知道repmat
的替代方案。矩阵索引可以实现与repmat
相同的行为并且更快。我从here采用了这种技术。
注意您可以编写以下声明
repmat(vec1,[size(mat1,1),1]);
作为
vec1([1:size(vec1,1)]'*ones(1,size(mat1,1)),:);
如果仔细观察,表达式会归结为vec1([1]'*[1 1 1 1]),:);
,这又是:
vec1([1 1 1 1]),:);
从而实现与repmat
相同的行为并且更快。我运行了三个解决方案100000
次,即
repmat
的解决方案:0.824518秒bsxfun
解决方案:0.683331秒您可以观察bsxfun
稍快一点。
答案 1 :(得分:3)
虽然您可以使用repmat
(@Parag's answer),但more efficient通常bsxfun
使用{{3}}。它还有一个优点,即代码(最后一行)对于行和列向量是相同的。
%// Example data
M = 4;
N = 5;
matrix = rand(M,N);
vector = rand(1,N); %// or size M,1
%// Computation
result = bsxfun(@times, matrix, vector); %// bsxfun does an "implicit" repmat