R 中的快速矩阵运算

Fast matrix operations in R

提问人:spellard 提问时间:7/13/2023 最后编辑:Dirk Eddelbuettelspellard 更新时间:7/14/2023 访问量:112

问:

几个简单的问题:

  1. 我想构建以下类型的矩阵:X
N = 1000
A = seq(1, N, 1)
B = A
X = A %*% t(rep(1,N)) - rep(1,N) %*% t(B)

使用这个矩阵有点慢:它需要大量的内存来处理大型矩阵,并且为它做矩阵乘法不使用线性结构,我想这可能会有所帮助(?XN

因此,我想避免这种情况,问题是:最快的计算方法是什么(每当我需要它时),可能不创建矩阵和?XA %*% t(rep(1,N))rep(1,N) %*% t(B)

  1. 如今,对于不同类型的矩阵乘法,最快的方法是什么?有一些新的包,据说速度很快,但似乎基础 R 仍然占主导地位?
library(microbenchmark)
A = array(rnorm(10^4), c(100,100))
B = array(rnorm(10^4), c(100,100))


microbenchmark(fastmatrix::hadamard(A,B), A*B,Rfast::mat.mult(A,B), A %*%B, Rfast::Crossprod(A,B), t(A)%*%B)

Unit: microseconds
                       expr     min       lq      mean   median       uq      max neval
 fastmatrix::hadamard(A, B) 174.626 264.2185 303.55052 277.3510 301.7825 1052.063   100
                      A * B   3.711  29.9485  28.81842  31.5185  33.9670   73.038   100
      Rfast::mat.mult(A, B) 760.087 839.6020 918.76155 891.4790 944.5455 1356.274   100
                    A %*% B 500.756 536.6595 602.09226 565.5765 601.5310 1502.310   100
     Rfast::Crossprod(A, B) 716.953 786.3320 854.55307 813.4165 874.3930 1589.097   100
                 t(A) %*% B 520.544 585.2830 666.63137 631.3350 703.5430 1322.987   100
R 性能 矩阵乘法 微基准

评论

0赞 Dirk Eddelbuettel 7/14/2023
鉴于这里缺乏内容,我正在编辑标签。Rcpprcpp
1赞 Maël 7/14/2023
请注意,在同一篇帖子上有两个问题是令人困惑的,因此您可能会得到更少的答案。我建议在另一篇文章中发布您的第二个问题。
2赞 merv 7/14/2023
我发现这里基准测试中操作的异质性分散了注意力。我认为如果只包括利息 () 和等价物的运算,问题会更清楚。具体来说,包括元素乘法 () 可能会导致一些误解,认为它在某种程度上“更好”,而它只是一个完全不同的操作。A %*% BA * B
0赞 Maël 7/14/2023
我已经尝试了几个选项,据说速度非常快,但到目前为止,没有什么能比得上你的技术了。更好地了解创建此矩阵的方式和原因可能会有所帮助。collapse::flagrow() - col()
0赞 Ben Bolker 7/14/2023
另请注意,有多种优化/并行化的 BLAS 包可用,它们可能会帮助您...simplystatistics.org/posts/2016-01-21-parallel-blas-in-r,bookdown.org/rdpeng/rprogdatascience/......

答:

2赞 Mikael Jagan 7/14/2023 #1

要回答您的第一个问题:

NN <- c(N, N)
Y <- .row(NN) - .col(NN)

identical(`storage.mode<-`(Y, "double"), X)
## [1] TRUE

可能不比你的代码慢或快多少(取决于你的 BLAS 实现),但肯定更透明,通常更有效率,给出 type 的结果,而不是 .这里的“陷阱”是 BLAS 例程想要的,因此使用结果进行计算可能需要强制......integerdoubledouble

要回答第二个问题,请注意 ,因此是“倾斜对称的”:Y' = -YY

identical(t(Y), -Y)
## [1] TRUE

根据您要执行的操作,您可以利用 (IIRC) 偏对称矩阵可以分解为 .是否有实现该因式分解的软件包(用它来求解线性系统等)还有待观察,但我对此表示怀疑。LDL'

如果你要做的只是矩阵乘法,那么我不希望偏对称性有任何帮助,除非你想编写自己的专用 Fortran 例程,以......DSYMM

评论

0赞 Maël 7/14/2023
我以前从未见过使用过!好。但它比 OP 提出的要快吗?.row