【发布时间】:2014-02-16 07:34:47
【问题描述】:
我想将 M × N 矩阵的每一列乘以大小为 N 的向量的对应元素。
我知道可以使用 for 循环。但我正在寻找一种更简单的方法。
【问题讨论】:
我想将 M × N 矩阵的每一列乘以大小为 N 的向量的对应元素。
我知道可以使用 for 循环。但我正在寻找一种更简单的方法。
【问题讨论】:
我想这就是你想要的:
mat1=randi(10,[4 5]);
vec1=randi(10,[1 5]);
result=mat1.*repmat(vec1,[size(mat1,1),1]);
rempat 将沿mat1 的行复制vec1。然后我们可以进行逐元素乘法(.*) 以“将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 稍快。
【讨论】:
bsxfun 是最快的方法。
虽然您可以使用repmat(如@Parag's answer)来实现,但通常more efficient 可以使用bsxfun。它还有一个优点是代码(最后一行)对于行向量和列向量是相同的。
%// 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
【讨论】:
bsxfun“知道”这些元素是相同的,所以在内部它不会像repmat 那样复制它们