2

例如,我有两个矩阵 A 和 B

A = [ 1 2 3; 5 4 3; ...]和 B = [ 1; 2;3;4;5个;6](行矩阵)

我想要这个

A*B = [1*1 2*1 3*1; 5*2 4*2 3*2;...]没有循环。是否可以?

4

3 回答 3

4

从数学上讲,两个矩阵只有在它们的维度一致时才能相乘;如果矩阵Am*n并且矩阵Bn*k那么你可以形成A*B具有维度的产品m*k。因此,从数学的角度来看,您的矩阵不能后乘以Awhich is 。如果您的矩阵实际上是,那么您可以形成具有维度的产品。请注意使用转置运算符从此处转置到此处。m*3B6*1A6*3B'*A1*3'B6*11*6

Matlab 的矩阵乘法(使用*运算符)符合矩阵是一致的数学要求。Matlab 还提供了另一个矩阵乘法运算符 ,.*它执行逐个元素的乘法,即它(i,j)通过乘法来形成结果的每个元素A(i,j)*B(i,j)。我看到@Thor 已经给了你一种方法来做到这一点。

如果您要做的是将行中的每个元素乘以另一种方法的行iA的标量,则iB

A.*(repmat(B,1,size(A,2)))

或者,您可以使用更高效但可能稍微不那么直观的方法,

bsxfun(@times, A,B);
于 2012-08-29T13:00:34.633 回答
0

以通用方式执行此操作需要A并且B具有相同数量的元素。这样做的一种方法是重塑 -> 乘法 -> 重塑,例如:

[x y] = size(A);
AmB   = reshape(A, 1, x*y) .* transpose(B);
AmB   = reshape(AmB, x, y); 
于 2012-08-29T12:53:51.657 回答
0

如果A行数与向量中的元素相同B

AmB = diag(B) * A

因为您要求的是行缩放。

这种表达方式优雅但不高效。对于高大的矩阵,应该首选A列上的循环。AmB(:,i) = A(:,i) .* B

于 2012-08-29T15:54:01.800 回答