【问题标题】:How to just calculate the diagonal of a matrix product in R如何在R中计算矩阵乘积的对角线
【发布时间】:2017-07-23 00:31:08
【问题描述】:

我有两个矩阵A 和B,那么只需 计算diag(A%*%B) 的最快方法是什么,即ith 的内积A的行和B的ith列,其他项的内积不关心。

补充:A 和 B 分别有较大的行号和列号。

【问题讨论】:

  • 类似但更清晰,因为它只涉及一次矩阵乘法。
  • @akrun 他们非常相似,是的。但是链接问题是数学中使用的一种模式,这不符合那种模式。也就是说,链接问题的答案实际上与该问题的答案几乎重复。另一个问题可能会有更多答案。

标签: r matrix-multiplication


【解决方案1】:

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

我们需要将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 真是一个聪明的方法。我会先试试这个。我认为这可能是软件计算方面最快的方法,但我认为在代数方面应该有更好的方法。
  • 它在数值上等同于diag(A %*% B),问题是在线性代数中没有一个好名字可以让colSums 用我的方式来表达它。
  • 它在数值上不等于diag(A %*% B),因为A %*% B 执行更多的乘法运算。线性代数colSums 将是rep(1, m) %*% (t(A) * B)。
  • 它执行了更多的乘法运算,但总是产生相同的结果。
猜你喜欢
  • 1970-01-01
  • 2011-01-19
  • 2014-07-17
  • 2014-03-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-06
  • 2011-04-22
相关资源
最近更新 更多