2017-03-03 93 views
4

我有两个矩阵AB,有啥以最快的方式只是计算diag(A%*%B),即,A第i行的内积和B,其他术语的内积不涉及怎样才算对角矩阵乘积的R中

增补:AB分别有较大的行数和列数。

+0

可能的重复http://stackoverflow.com/questions/21708489/compute-only-diagonals-of-matrix-multiplication-in-r – akrun

+0

它相似但更清晰,因为它只涉及一个矩阵乘法。 –

+0

@akrun他们非常相似,是的。但是,相关问题是数学中使用的一种模式,并不适合这种模式。也就是说,这个问题的答案实际上与这个问题的答案差不多。另一个问题可能会承认更多的答案。 –

回答

8

这可以在没有全矩阵乘法的情况下完成,仅使用矩阵元素的乘法。

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

结果是一样的。

+0

@AndreyShabalin真的是一个聪明的方法。我会先试试这个。我认为这可能是软件计算方面最快的方法,但我认为在代数方面应该有更好的方法。 –

+0

它在数值上等同于'diag(A%*%B)',问题是'colSums'没有一个好的名字用于线性代数。 –