在MATLAB中通过相应的向量元素乘以列元素的简单方法?

时间:2014-02-16 07:34:47

标签: matlab matrix

我想将M×N矩阵的每一列乘以大小为N的向量的相应元素。

我知道可以使用for循环。但我正在寻求一种更简单的方法。

2 个答案:

答案 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次,即

  1. 使用repmat的解决方案:0.824518秒
  2. 使用上面解释的索引技术的解决方案:0.734435秒
  3. 使用@LuisMendo提供的bsxfun解决方案:0.683331秒
  4. 您可以观察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