Эквивалент row() и col() для big.matrix в R

Я использую пакет bigmemory для обработки большой матрицы размером 8000 x 8000.

Что эквивалентно row() и col() для большой матрицы?

Когда я попытался использовать две вышеуказанные функции для доступа к объекту big.matrix, я получил следующую ошибку.

"Ошибка в строке (phi): матричный объект требуется в качестве аргумента для строки"

Ниже мой фрагмент кода.

k <- big.matrix(nrow = 8000, ncol = 8000, type = 'double', init = 0)
k <- ifelse(row(k) < col(k), 0, (row(k)-col(k))^5 + 2)

1 ответ

Решение

Итак, с 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 секунд (и намного больше памяти).

Другие вопросы по тегам