所以我有以下矩阵:
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
答案 0 :(得分:4)
MATLAB已具备在bsxfun
函数中执行此操作的功能。 bsxfun
将采用两个矩阵并复制单个维度,直到矩阵大小相同,然后对两个矩阵执行二进制运算。因此,对于您的示例,您只需执行以下操作:
C = bsxfun(@times,mat,vec);
答案 1 :(得分:2)
引用MrAzzaman,bsxfun
是这样做的方法。但是,从你的功能名称来看,这看起来像是家庭作业,所以让我们坚持你原来的功能。因此,您只需要编写两个for
循环。您可以使用第二个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
并通过堆叠制作与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