我有两个矩阵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; ......] 没有循环。有可能吗?
答案 0 :(得分:4)
从数学上讲,两个矩阵只有在尺寸符合的情况下才能成倍增加;如果矩阵A
为m*n
而矩阵B
为n*k
,那么您可以形成具有维度A*B
的产品m*k
。因此,从数学的角度来看,A
的矩阵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);
答案 1 :(得分:0)
以通用方式执行此操作要求A
和B
具有相同数量的元素。这样做的一种方法是重塑 - >乘以 - >重塑,例如:
[x y] = size(A);
AmB = reshape(A, 1, x*y) .* transpose(B);
AmB = reshape(AmB, x, y);
答案 2 :(得分:0)
如果A
的行数与向量B
AmB = diag(B) * A
因为您要求的是行缩放。
这个表达式优雅但效率不高。对于较高的A
矩阵,应首选AmB(:,i) = A(:,i) .* B
列上的循环。