如何将给定矩阵的每一行中的所有元素与给定向量的相应元素相乘并在 MATLAB 中求和?

Posted

技术标签:

【中文标题】如何将给定矩阵的每一行中的所有元素与给定向量的相应元素相乘并在 MATLAB 中求和?【英文标题】:How do I multiply all the elements in each row of a given matrix with corresponding elements of a given vector and sum them in MATLAB? 【发布时间】:2011-11-07 03:09:16 【问题描述】:

例如,给定一个矩阵 randn(3,2) - 3 行 2 列和一个乘数向量 randn(1,2)) 2 列,我想得到一个大小为 (3, 1) 的向量,其中每一行代表每行的总和矩阵行元素的元素乘法和给定的乘数,如

row_element_1*mul_element_1 + row_element_2*mul_element_2

【问题讨论】:

【参考方案1】:

听起来你想要矩阵向量乘法。

1> x = randn(3, 2)
x =

   0.62055  -1.08060
  -0.24064  -2.56097
  -0.53202  -0.49712

2> y = randn(1, 2)
y =

  -1.26010  -0.25200

3> x * y'
ans =

  -0.50964
   0.94860
   0.79567

注意转置y'

【讨论】:

这不符合要求。不应该有转置,y 应该是 2x1(如问题所述)。 @BenVoigt:现在似乎符合要求。我没有在答案中看到“不应该有转置”。 嗯,好的,问题确实指定了一个 1x2 向量。因此,您的编辑,删除x 上的转置并更改y 的大小和转置是正确的。 +1。【参考方案2】:

我认为您可以结合使用 bsxfun 和 sum 来做到这一点,如下所示:

a = rand(3,2);
b = rand(1,2);
result = sum(bsxfun(@times,a,b),2)

result =

   0.333379034494579
   0.613480382112731
   0.093702948350719

注意 SUM 的维度参数沿每一行求和(而不是默认值,即向下列)。 BSXFUN 应用了一个带有标量扩展的二进制函数,非常适合这里的乘法部分。

【讨论】:

【参考方案3】:
A = randn(3, 2);
B = randn(1, 2);

C = A(:, 1) * B(1) + A(:, 2) * B(2);   % size(C) = [3, 1]

如果您必须扩展到包含更多列的更大数组并且不想完整地写出 C 的等式,则可以使用 repmat 和逐元素乘法

A = randn(300, 200);
B = randn(1, 200);

C = sum(A .* repmat(B, 300, 1), 2);

【讨论】:

以上是关于如何将给定矩阵的每一行中的所有元素与给定向量的相应元素相乘并在 MATLAB 中求和?的主要内容,如果未能解决你的问题,请参考以下文章

给定列表的元素,如何在列表中恢复其索引?

如何在sas中将每一行与另一个矩阵元素的每一行相乘?

是否有将dask.array的每一行(或列)乘以向量元素的有效方法?

使用其他向量中的相应元素更改 arma::vec 中给定位置的元素

根据部分填充的向量形成“部分”单位矩阵

将密集向量与 Tensorflow 中稀疏矩阵的每一行相乘