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
代表二进制单例扩展函数,这是一种表达我刚才所说内容的奇特方式
所以你