如何在R语言中仅计算矩阵乘积的对角线

9
我有两个矩阵 A 和 B,那么最快的方法只是计算 diag(A%*%B),即 A 的第 i 行和 B 的第 i 列的内积,而不关注其他项的内积。 补充说明:A 和 B 的行列数都很大。

可能是 https://dev59.com/3mEi5IYBdhLWcg3wDoaV 的重复问题。 - akrun
它类似,但更清晰,因为它只涉及一个矩阵乘法。 - Andrey Shabalin
@akrun 是的,它们非常相似。但是,所链接的问题是数学中使用的一种模式,而这并不符合该模式。话虽如此,链接问题的答案实际上与这个问题的答案几乎完全相同。另一个问题可能会有更多的答案。 - Matthew Lundberg
1个回答

20

我们可以通过仅仅对矩阵元素进行乘法运算,而不是进行完整的矩阵乘法来完成这个操作。

我们需要将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

结果都是一样的。

@AndreyShabalin 真是个聪明的方法。我会先尝试这个。我认为这可能是在软件计算方面最快的方法,但我认为在代数方面应该有更好的方法。 - Bs He
它在数值上等同于 diag(A %*% B),问题在于线性代数中没有一个好的名称可以像我这样来表达 colSums - Andrey Shabalin
它与 diag(A %*% B) 在数值上并不相等,因为 A %*% B 执行了更多的乘法运算。线性代数中的 colSums 可以表示为 rep(1, m) %*% (t(A) * B) - IceCreamToucan
它执行了更多的乘法,但总是产生相同的结果。 - Andrey Shabalin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接