0

所以我有以下矩阵:

A = [1 2 3; 4 5 6];
B = [0.5 2 3];

我正在 MATLAB 中编写一个函数,只要向量中的元素数与列数匹配,我就可以将向量和矩阵逐个元素相乘。其中A有 3 列:

1 2 3
4 5 6

B也有 3 个元素,所以这应该可以工作。我正在尝试基于Aand生成以下输出B

0.5  4  9
2   10 18

我的代码如下。有谁知道我做错了什么?

function C = lab11(mat, vec)
C = zeros(2,3);
[a, b] = size(mat);
[c, d] = size(vec);
for i = 1:a
      for k = 1:b
          for j = 1
              C(i,k) = C(i,k) + A(i,j) * B(j,k);
          end
      end
  end
end
4

2 回答 2

4

MATLAB 已经在函数中具有执行此操作的bsxfun功能。bsxfun将取两个矩阵并复制单维,直到矩阵大小相同,然后对两个矩阵执行二元运算。因此,对于您的示例,您只需执行以下操作:

C = bsxfun(@times,mat,vec);
于 2014-11-12T02:48:17.117 回答
2

参考 MrAzzamanbsxfun是解决这个问题的方法。但是,从您的函数名称来看,这看起来像是作业,所以让我们坚持原来的。因此,您只需要编写两个for循环。您将使用第二个for循环同时索引向量和矩阵的列。最外面的for循环将访问矩阵的行。此外,您正在引用AB,它们是代码中不存在的变量。您还将输出矩阵初始化C为 2 x 3 always。您希望它的大小与mat. 我还删除了您对向量长度的检查,因为您没有对结果做任何事情。

像这样:

function C = lab11(mat, vec)
[a, b] = size(mat);
C = zeros(a,b);
for i = 1:a
      for k = 1:b
          C(i,k) = mat(i,k) * vec(k);
      end
  end
end

请特别注意我所做的事情。最外层for循环访问 的行mat,而最内层循环访问 的列和mat元素vec。请记住, 的列数mat需要与 中的元素数相同vec。您可能应该在您的代码中检查这一点。


如果您不喜欢使用该bsxfun方法,另一种方法是获取向量vec并从中制作一个矩阵,该矩阵的大小与mat将向量堆叠在vec自身顶部的次数与我们在mat. 在此之后,您可以进行逐个元素的乘法。您可以通过使用repmatwhich 在您想要的任何维度中重复给定次数的向量或矩阵来进行此堆叠。因此,您的功能将简化为:

function C = lab11(mat, vec)
rows = size(mat, 1);
vec_mat = repmat(vec, rows, 1);
C = mat .* vec_mat;
end

但是,我个人会选择这bsxfun条路线。 bsxfun基本上做了repmat范式在幕后所做的事情。在内部,它确保您的两个输入具有相同的大小。如果不是,它会复制较小的数组/矩阵,直到它与较大的数组/矩阵大小相同,然后对两个变量中的相应元素应用逐个元素的操作。 bsxfun代表Binary Singleton EXpansion FUNction,这是一种准确地说出我刚刚谈到的东西的奇特方式。

因此,您的功能进一步简化为:

function C = lab11(mat, vec)
C = bsxfun(@times, mat, vec);
end

祝你好运!

于 2014-11-12T04:08:07.007 回答