Matlab中的逐元素矩阵乘法

Matlab中的逐元素矩阵乘法,matlab,matrix,vector,matrix-multiplication,vector-multiplication,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个元素,因此应该可以使用。我试图根据A和B生成以下输出: 0.5 4 9 2 10 18 我的代码如下。有人知道我做错了什么吗 function C = lab11(mat, vec) C = zeros(2,3); [a, b] = size(mat);

我有以下矩阵:

A = [1 2 3; 4 5 6];
B = [0.5 2 3];
我正在用MATLAB编写一个函数,它允许我将向量和矩阵乘以元素,只要向量中的元素数与列数匹配。在
A
中有3列:

1 2 3
4 5 6
B
还有3个元素,因此应该可以使用。我试图根据
A
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

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

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

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

C = bsxfun(@times,mat,vec);
这是一个好办法。然而,从你的函数名来看,这看起来像是家庭作业,所以让我们坚持你原来的想法。因此,只需为循环编写两个
。您可以使用第二个
for
循环同时索引到矩阵的向量和列中。最外层的
for
循环将访问矩阵的行。此外,您正在引用
A
B
,它们是代码中不存在的变量。您还将输出矩阵
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
,并通过将向量
vec
堆叠在其自身顶部的次数与
mat
中的行数相同的方式,由此生成一个与
mat
大小相同的矩阵。在此之后,您可以逐个元素进行乘法。您可以通过使用在任意维度中重复给定次数的向量或矩阵来完成此堆叠。因此,您的功能将简化为:

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

然而,我个人会选择
bsxfun
路线
bsxfun
基本上完成了
repmat
范例在引擎盖下的工作。在内部,它确保两个输入具有相同的大小。如果没有,则复制较小的数组/矩阵,直到其大小与较大的数组/矩阵相同,然后对两个变量中的相应元素应用逐元素操作
bsxfun
代表二进制单例扩展函数,这是一种表达我刚才所说内容的奇特方式

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

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

祝你好运

参考MrAzzaman,是解决这个问题的方法。然而,从你的函数名来看,这看起来像是家庭作业,所以让我们坚持你原来的想法。因此,只需为
循环编写两个
。您可以使用第二个
for
循环同时索引到矩阵的向量和列中。最外层的
for
循环将访问矩阵的行。此外,您正在引用
A
B
,它们是代码中不存在的变量。您还将输出矩阵
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
,并通过将向量
vec
堆叠在其自身顶部的次数与
mat
中的行数相同的方式,由此生成一个与
mat
大小相同的矩阵。在此之后,您可以逐个元素进行乘法。您可以通过使用在任意维度中重复给定次数的向量或矩阵来完成此堆叠。因此,您的功能将简化为:

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

然而,我个人会选择
bsxfun
路线
bsxfun
基本上完成了
repmat
范例在引擎盖下的工作。在内部,它确保两个输入具有相同的大小。如果没有,则复制较小的数组/矩阵,直到其大小与较大的数组/矩阵相同,然后对两个变量中的相应元素应用逐元素操作
bsxfun
代表二进制单例扩展函数,这是一种表达我刚才所说内容的奇特方式

所以你