例如,我有两个矩阵 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;...]没有循环。是否可以?
例如,我有两个矩阵 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;...]没有循环。是否可以?
从数学上讲,两个矩阵只有在它们的维度一致时才能相乘;如果矩阵A
是m*n
并且矩阵B
是n*k
那么你可以形成A*B
具有维度的产品m*k
。因此,从数学的角度来看,您的矩阵不能后乘以A
which is 。如果您的矩阵实际上是,那么您可以形成具有维度的产品。请注意使用转置运算符从此处转置到此处。m*3
B
6*1
A
6*3
B'*A
1*3
'
B
6*1
1*6
Matlab 的矩阵乘法(使用*
运算符)符合矩阵是一致的数学要求。Matlab 还提供了另一个矩阵乘法运算符 ,.*
它执行逐个元素的乘法,即它(i,j)
通过乘法来形成结果的每个元素A(i,j)*B(i,j)
。我看到@Thor 已经给了你一种方法来做到这一点。
如果您要做的是将行中的每个元素乘以另一种方法的行i
中A
的标量,则i
B
A.*(repmat(B,1,size(A,2)))
或者,您可以使用更高效但可能稍微不那么直观的方法,
bsxfun(@times, A,B);
以通用方式执行此操作需要A
并且B
具有相同数量的元素。这样做的一种方法是重塑 -> 乘法 -> 重塑,例如:
[x y] = size(A);
AmB = reshape(A, 1, x*y) .* transpose(B);
AmB = reshape(AmB, x, y);
如果A
行数与向量中的元素相同B
AmB = diag(B) * A
因为您要求的是行缩放。
这种表达方式优雅但不高效。对于高大的矩阵,应该首选A
列上的循环。AmB(:,i) = A(:,i) .* B