【问题标题】:Calculate the diagonal of a big.matrix in R计算 R 中 big.matrix 的对角线
【发布时间】:2018-09-21 15:59:38
【问题描述】:

我正在处理几个 1.3e6 行的大平方矩阵,我想要它们的对角线。我需要一种有效的方法来做到这一点,但我不能使用 diag()

library(bigmemory)
A=big.matrix(nrow=1.3e6,ncol=1.3e6,init=3)
diag(A)

有什么想法吗? 非常感谢您的宝贵时间

【问题讨论】:

  • 不是一个完整的解决方案,但您可以拆分此矩阵(然后使用正常矩阵表示法)还是对您的分析不起作用?例如 A=matrix(3, nrow=1.3e6/100,ncol=1.3e6/100) diag(A) 然后循环 100 次。
  • 你真的有一个 1,300,000 x 1,300,000 big.matrix 吗?获得对角线的一种有效方法是在 Rcpp 中实现它。但是,我认为这里还有其他事情发生..
  • 我只想要一种有效的方法来提取矩阵的对角线。我看到在Rcpp包中有一个函数调用cppFunction来调用C++,而zenglix.github.io/Rcpp_basic中的Li Zeng使用arma::vec中的“diagmat”函数来提取矩阵的对角线。但是,我不知道如何用 cppFunction 调用它
  • cppFunction('NumericVector diagC(NumericMatrix x) { int nrow = x.nrow(), ncol = x.ncol(); NumericVector out(nrow); out=diagmat( x ); return out ; }',depends=arma::vec::iterator)

标签: r bigdata diagonal r-bigmemory


【解决方案1】:

好的,事实上,这里不需要 Rcpp。 只需使用两列的特殊矩阵访问器:

library(bigmemory)

X <- big.matrix(10, 10); X[] <- 1:100

d <- min(dim(X))
X[cbind(1:d, 1:d)]

X[cbind(1:d, 1:d)] 将访问 X[1, 1]X[2, 2]、...、X[d, d]

【讨论】:

  • 非常感谢您的回答。它工作正常,我已经检查了库 profvis,这段代码的性能非常好。
猜你喜欢
  • 1970-01-01
  • 2016-08-19
  • 2014-03-09
  • 1970-01-01
  • 2017-07-23
  • 1970-01-01
  • 2012-01-09
  • 2022-01-08
  • 2022-08-10
相关资源
最近更新 更多