提问人:spellard 提问时间:7/13/2023 最后编辑:Dirk Eddelbuettelspellard 更新时间:7/14/2023 访问量:112
R 中的快速矩阵运算
Fast matrix operations in R
问:
几个简单的问题:
- 我想构建以下类型的矩阵:
X
N = 1000
A = seq(1, N, 1)
B = A
X = A %*% t(rep(1,N)) - rep(1,N) %*% t(B)
使用这个矩阵有点慢:它需要大量的内存来处理大型矩阵,并且为它做矩阵乘法不使用线性结构,我想这可能会有所帮助(?X
N
因此,我想避免这种情况,问题是:最快的计算方法是什么(每当我需要它时),可能不创建矩阵和?X
A %*% t(rep(1,N))
rep(1,N) %*% t(B)
- 如今,对于不同类型的矩阵乘法,最快的方法是什么?有一些新的包,据说速度很快,但似乎基础 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
答:
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 例程想要的,因此使用结果进行计算可能需要强制......integer
double
double
要回答第二个问题,请注意 ,因此是“倾斜对称的”:Y' = -Y
Y
identical(t(Y), -Y)
## [1] TRUE
根据您要执行的操作,您可以利用 (IIRC) 偏对称矩阵可以分解为 .是否有实现该因式分解的软件包(用它来求解线性系统等)还有待观察,但我对此表示怀疑。LDL'
如果你要做的只是矩阵乘法,那么我不希望偏对称性有任何帮助,除非你想编写自己的专用 Fortran 例程,以......DSYMM
评论
0赞
Maël
7/14/2023
我以前从未见过使用过!好。但它比 OP 提出的要快吗?.row
评论
Rcpp
rcpp
A %*% B
A * B
collapse::flag
row() - col()