【问题标题】:How to index and multiply two matrices efficiently?如何有效地索引和相乘两个矩阵?
【发布时间】:2015-06-23 22:21:36
【问题描述】:

我有两个矩阵“A”、“B”和一个数据框“C”。他们是

A <- matrix(1:10, nrow = 2) 
colnames(A) <- letters[1:5]

B <- matrix(11:16, nrow = 2)
colnames(B) <- letters[6:8]

C <- data.frame(ix1 = c("a", "d"), ix2 = c("f", "h"))

我想创建一个长度为 2 和值的向量“vec”

vec[1] = A[,"a"] %*% B[,"f"]
vec[2] = A[,"d"] %*% B[,"h"]

这可以通过for 循环轻松完成,但是当“A”、“B”和“C”的大小增加时会很耗时。怎么做才高效?

【问题讨论】:

  • 你的例子中“C”有什么用?
  • for 循环是如何完成的?
  • @Pascal 他使用它来索引AB
  • @DavidArenburg 我没看到。
  • @DavidArenburg 我的意思是,问题中没有明确使用它。因此,在明确指定其用途之前,它是无用的。

标签: r matrix indexing


【解决方案1】:

你可以使用mapply:

vec = mapply(function(u,v) A[,u]%*%B[,v], c('a','d'), c('f','h'))

如果你想使用你的data.frameC

vec = mapply(function(u,v) A[,u]%*%B[,v], as.character(C[,1]), as.character(C[,2]))
#  a   d 
# 35 233

真正重要的是C的行数,AB的行数可能不是瓶颈:

v1=rnorm(1000000)
v2=rnorm(1000000)

#> system.time(v1%*%v2)
#   user  system elapsed 
#   0.01    0.00    0.02 

【讨论】:

  • 谢谢@colonel,这就是我要找的东西
【解决方案2】:

您可以按如下方式进行矢量化,但我不确定转置A 的成本有多大

(vec <- diag(crossprod(A[, as.character(C$ix1)], B[, as.character(C$ix2)])))
## [1]  35 233

【讨论】:

  • 我不喜欢这些可爱的打印对象的方法,我最近在这里经常看到(也在 data.table 答案中)。它们混淆了代码库中的意图,因此是不好的做法。显式调用print 有什么问题?
  • 我喜欢它,但你做的计算比必要的多...很有趣知道与mapply 的权衡。
  • @Roland 有什么问题?我在 R 文档中看到了很多。以?strptime 为例。
  • @ColonelBeauvel 任何比较都取决于输入大小和 BLAS。
  • @DavidArenburg 我在评论中表达了为什么我认为这是错误的。 (我认为在 data.table 中显式调用 print 甚至可以更快。至少,以前是这样。)
猜你喜欢
  • 1970-01-01
  • 2020-12-06
  • 1970-01-01
  • 1970-01-01
  • 2021-02-27
  • 2017-02-13
  • 2017-11-28
  • 2013-03-21
  • 1970-01-01
相关资源
最近更新 更多