Вычислить диагональ big.matrix в R

Я работаю с несколькими большими квадратными матрицами 1,3e6 строк, и мне нужна диагональ всех из них. Мне нужен эффективный способ сделать это, но я не могу использовать diag()

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

Есть идеи? Большое спасибо за уделенное время


person LauC    schedule 21.09.2018    source источник
comment
Не полное решение, но не могли бы вы разделить эту матрицу (затем использовать обычную матричную нотацию) или это не работает для вашего анализа? Например, A=matrix(3, nrow=1.3e6/100,ncol=1.3e6/100) diag(A), затем выполните цикл 100 раз.   -  person Hector Haffenden    schedule 21.09.2018
comment
У вас действительно есть 1 300 000 x 1 300 000 big.matrix? Эффективным способом получения диагонали было бы реализовать ее в Rcpp. Но мне кажется тут что-то другое..   -  person F. Privé    schedule 21.09.2018
comment
Мне нужен только эффективный способ извлечь диагональ матрицы. Я видел, что в пакете Rcpp есть вызов функции cppFunction для вызова C++, и что Ли Цзэн в zenglix.github .io/Rcpp_basic использует функцию diagmat из arma::vec для извлечения диагонали матрицы. Но я не знаю, как это вызвать с помощью cppFunction   -  person LauC    schedule 22.09.2018
comment
cppFunction('NumericVector diagC(NumericMatrix x) { int nrow = x.nrow(), ncol = x.ncol(); NumericVector out(nrow); out=diagmat(x); return out; }',depends=arma: :vec::итератор)   -  person LauC    schedule 22.09.2018


Ответы (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].

person F. Privé    schedule 22.09.2018
comment
Большое спасибо за ваш ответ. это работает, и я проверил с библиотекой profvis, и производительность этого кода довольно хорошая. - person LauC; 24.09.2018