R 中 big.matrix 的 row() 和 col() 的等价物
Equivalent of row() and col() for big.matrix in R
我正在使用 bigmemory 包来处理大小为 8000 x 8000 的大型矩阵。
大矩阵的 row() 和 col() 等价于什么?
当我尝试使用以上两个函数访问 big.matrix 对象时,我收到以下错误。
"Error in row(phi) : a matrix-like object is required as argument to 'row'"
下面是我的代码片段。
k <- big.matrix(nrow = 8000, ncol = 8000, type = 'double', init = 0)
k <- ifelse(row(k) < col(k), 0, (row(k)-col(k))^5 + 2)
因此,使用 Rcpp,您可以:
// [[Rcpp::depends(BH, bigmemory)]]
#include <bigmemory/MatrixAccessor.hpp>
#include <Rcpp.h>
using namespace Rcpp;
// [[Rcpp::export]]
void fillBM(SEXP pBigMat) {
XPtr<BigMatrix> xpMat(pBigMat);
MatrixAccessor<double> macc(*xpMat);
int n = macc.nrow();
int m = macc.ncol();
for (int j = 0; j < m; j++) {
for (int i = j; i < n; i++) {
macc[j][i] = pow(i - j, 5) + 2;
}
}
}
/*** R
library(bigmemory)
k <- big.matrix(nrow = 8000, ncol = 8000, type = 'double', init = 0)
k.mat <- k[]
system.time(
fillBM(k@address)
)
k[1:5, 1:5]
system.time(
k.mat <- ifelse(row(k.mat) < col(k.mat), 0, (row(k.mat)-col(k.mat))^5 + 2)
)
k.mat[1:5, 1:5]
all.equal(k.mat, k[])
*/
Rcpp 函数需要 2 秒,而 R 版本(在标准 R 矩阵上)需要 10 秒(以及更多的内存)。
我正在使用 bigmemory 包来处理大小为 8000 x 8000 的大型矩阵。
大矩阵的 row() 和 col() 等价于什么?
当我尝试使用以上两个函数访问 big.matrix 对象时,我收到以下错误。
"Error in row(phi) : a matrix-like object is required as argument to 'row'"
下面是我的代码片段。
k <- big.matrix(nrow = 8000, ncol = 8000, type = 'double', init = 0)
k <- ifelse(row(k) < col(k), 0, (row(k)-col(k))^5 + 2)
因此,使用 Rcpp,您可以:
// [[Rcpp::depends(BH, bigmemory)]]
#include <bigmemory/MatrixAccessor.hpp>
#include <Rcpp.h>
using namespace Rcpp;
// [[Rcpp::export]]
void fillBM(SEXP pBigMat) {
XPtr<BigMatrix> xpMat(pBigMat);
MatrixAccessor<double> macc(*xpMat);
int n = macc.nrow();
int m = macc.ncol();
for (int j = 0; j < m; j++) {
for (int i = j; i < n; i++) {
macc[j][i] = pow(i - j, 5) + 2;
}
}
}
/*** R
library(bigmemory)
k <- big.matrix(nrow = 8000, ncol = 8000, type = 'double', init = 0)
k.mat <- k[]
system.time(
fillBM(k@address)
)
k[1:5, 1:5]
system.time(
k.mat <- ifelse(row(k.mat) < col(k.mat), 0, (row(k.mat)-col(k.mat))^5 + 2)
)
k.mat[1:5, 1:5]
all.equal(k.mat, k[])
*/
Rcpp 函数需要 2 秒,而 R 版本(在标准 R 矩阵上)需要 10 秒(以及更多的内存)。