matlab中的元素矩阵乘法元素

时间:2014-11-12 02:42:46

标签: matlab matrix vector matrix-multiplication vector-multiplication

所以我有以下矩阵:

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

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

1 2 3
4 5 6

B也有3个元素,所以这应该有效。我尝试根据AB生成以下输出:

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

2 个答案:

答案 0 :(得分:4)

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

C = bsxfun(@times,mat,vec);

答案 1 :(得分:2)

引用MrAzzaman,bsxfun是这样做的方法。但是,从你的功能名称来看,这看起来像是家庭作业,所以让我们坚持你原来的功能。因此,您只需要编写两个for循环。您可以使用第二个for循环同时索引矩阵的向量和列。最外面的for循环将访问矩阵的行。此外,您引用的是AB,它们是代码中不存在的变量。您还要将输出矩阵C初始化为2 x 3 始终。您希望它与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中的行数一样多。在此之后,您可以逐个元素进行乘法运算。您可以使用repmat执行此堆叠,{{3}}在您想要的任何维度中重复给定次数的向量或矩阵。因此,您的功能将简化为:

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

祝你好运!