我有两个矩阵 A 和 B,那么最快的方法只是计算 diag(A%*%B),即 A 的第 i 行和 B 的第 i 列的内积,而不关注其他项的内积。 补充说明:A 和 B 的行列数都很大。
我们可以通过仅仅对矩阵元素进行乘法运算,而不是进行完整的矩阵乘法来完成这个操作。
我们需要将A
的行与B
的相应列相乘并求和元素。A
的行是t(A)
的列,我们对其进行逐元素与B
相乘,并对列求和。
换句话说:colSums(t(A) * B)
首先我们创建一个样例数据来测试代码:
n = 5
m = 10000;
A = matrix(runif(n*m), n, m);
B = matrix(runif(n*m), m, n);
你的代码:
diag(A %*% B)
# [1] 2492.198 2474.869 2459.881 2509.018 2477.591
不使用矩阵乘法的直接计算:
colSums(t(A) * B)
# [1] 2492.198 2474.869 2459.881 2509.018 2477.591
diag(A %*% B)
,问题在于线性代数中没有一个好的名称可以像我这样来表达 colSums
。 - Andrey Shabalindiag(A %*% B)
在数值上并不相等,因为 A %*% B
执行了更多的乘法运算。线性代数中的 colSums
可以表示为 rep(1, m) %*% (t(A) * B)
。 - IceCreamToucan