Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 将矩阵的每一行乘以另一个矩阵_Arrays_Matlab_Matrix - Fatal编程技术网

Arrays 将矩阵的每一行乘以另一个矩阵

Arrays 将矩阵的每一行乘以另一个矩阵,arrays,matlab,matrix,Arrays,Matlab,Matrix,假设我有下面的矩阵 B = [1 2 3;4 5 6;7 8 9;10 11 12] 还有另一个矩阵 A = [a b c;d e f;g h i] 如何将矩阵B的每一行乘以矩阵A(不使用for循环),即 非常感谢。您可以使用: c = diag(B*A*B.'); 然而,这计算一个完整的4×4矩阵只是为了提取它的对角线,所以它不是很有效 仅计算所需值的更有效方法是: c = sum(bsxfun(@times, permute(sum(bsxfun(@times, B, permute(

假设我有下面的矩阵

B = [1 2 3;4 5 6;7 8 9;10 11 12]
还有另一个矩阵

A = [a b c;d e f;g h i]
如何将矩阵B的每一行乘以矩阵A(不使用for循环),即

非常感谢。您可以使用:

c = diag(B*A*B.');
然而,这计算一个完整的4×4矩阵只是为了提取它的对角线,所以它不是很有效

仅计算所需值的更有效方法是:

c = sum(bsxfun(@times, permute(sum(bsxfun(@times, B, permute(A, [3 1 2])), 2), [1 3 2]), B), 2);
以下是上述代码的细分:

c1 = sum(bsxfun(@times, B, permute(A, [3 1 2])), 2); % B(i,:)*A
c = sum(bsxfun(@times, permute(c1, [1 3 2]), B), 2); % (B(i,:)*A)*B(i,:)'
使用第一个
排列
,以便B中的列数与A中的列数匹配。在
bsxfun()
中的元素相乘之后,每一行被求和(记住,
permute
将行移动到第二维度),再现了
for
循环中发生的向量矩阵相乘B(i,:)*A的效果

在第一个
和之后,第二个维度是单态维度。因此,我们使用第二个
排列
将第二个维度移动到第三个维度,并生成一个二维矩阵。现在,c1B大小相同。在第二个
bsxfun()
中的元素相乘之后,每个列都被求和(请记住,
permute
将列移回第二维),再现B(i,:)*A*B(i,:)'的效果

注意这种方法的一个潜在优势。因为我们使用元素相乘来复制矩阵相乘的结果,所以在
bsxfun()
调用中,参数的顺序并不重要。少担心一件事

或者,从Matlab R2016b开始,您可以用
*
替换
bsxfun(@times,…)
,这要感谢:


当涉及到MATLAB中的矩阵乘法/运算时,运算顺序可能是一个巨大的难题。这种方法有一些隐藏的优点,因为元素级乘法不需要跟踪顺序。只要确保在
bsxfun()
调用中有正确的矩阵,就可以开始了!伟大的answer@VladislavMartin谢谢也为广泛的编辑
c1 = sum(bsxfun(@times, B, permute(A, [3 1 2])), 2); % B(i,:)*A
c = sum(bsxfun(@times, permute(c1, [1 3 2]), B), 2); % (B(i,:)*A)*B(i,:)'
c = sum(permute(sum(B.*permute(A, [3 1 2]), 2), [1 3 2]).*B, 2);