Обнуление элементов разреженной матрицы на основе другой матрицы (Matrix Package)

У меня есть W, который представляет собой двоичную разреженную матрицу из 4 миллионов строк. Я использую пакет Matrix. Я хотел бы иметь возможность вычислить следующее:

W2 = W %*% W             #W2 becomes a dgCMatrix
W2@x[ W2@x > 1 ] = 1
W2 = W2 - W
W2@x[ W2@x < 0 ] = 0

К сожалению, третья строка в этой операции полностью портит мой компьютер. Я могу вычислить строки (1) и (2) просто отлично, но когда я пытаюсь вычислить строку (3), R требует гораздо больше оперативной памяти, чем у меня есть. Я уверен, что W2 - W "более редкий", чем W2 один.

Есть ли какой-нибудь алгоритм в векторной форме, который позволяет обнулить позиции W2, равные 1 в W? Есть ли эффективный способ реализовать это в R?


person mmgm    schedule 30.11.2011    source источник
comment
Я исправил, чтобы помочь другим избежать той же ошибки интерпретации, что и я. 2-я и 4-я строки тривиальны. 3-я строка является ключевой. Это не так сложно решить, если вы сопоставите одномерный список координат.   -  person Iterator    schedule 04.01.2012


Ответы (1)


Я предполагаю, что матрица 4 000 000x4 000 000, иначе строка 1 вернет ошибку «Внутренние размеры A и B должны совпадать».

У меня возникли трудности с воспроизведением ваших проблем. Смотри ниже.

> library(Matrix)
> W<-rsparsematrix(nrow=4000000,ncol=4000000,density = .0000001)
> W<-W>0
> str(W)
Formal class 'lgCMatrix' [package "Matrix"] with 6 slots
  ..@ i       : int [1:1600000] 623428 717198 3216269 3398149 3888958 3970651 3106201 61257 370389 3031066 ...
  ..@ p       : int [1:4000001] 0 2 3 3 4 5 6 6 6 7 ...
  ..@ Dim     : int [1:2] 4000000 4000000
  ..@ Dimnames:List of 2
  .. ..$ : NULL
  .. ..$ : NULL
  ..@ x       : logi [1:1600000] TRUE FALSE TRUE TRUE FALSE TRUE ...
  ..@ factors : list()
> W2 <- W %*% W
> str(W2)
Formal class 'dgCMatrix' [package "Matrix"] with 6 slots
  ..@ i       : int [1:638322] 908991 1031349 2979756 1924552 3421130 992757 1375889 2872056 3161609 3389210 ...
  ..@ p       : int [1:4000001] 0 0 0 0 0 0 0 0 0 0 ...
  ..@ Dim     : int [1:2] 4000000 4000000
  ..@ Dimnames:List of 2
  .. ..$ : NULL
  .. ..$ : NULL
  ..@ x       : num [1:638322] 1 0 0 0 0 1 1 1 1 0 ...
  ..@ factors : list()     
> W2@x[ W2@x > 1 ] = 1
> W2 = W2 - W
> W2@x[ W2@x < 0 ] = 0
> str(W2)
Formal class 'dgCMatrix' [package "Matrix"] with 6 slots
  ..@ i       : int [1:2238320] 623428 717198 3216269 3398149 3888958 3970651 3106201 61257 370389 908991 ...
  ..@ p       : int [1:4000001] 0 2 3 3 4 5 6 6 6 7 ...
  ..@ Dim     : int [1:2] 4000000 4000000
  ..@ Dimnames:List of 2
  .. ..$ : NULL
  .. ..$ : NULL
  ..@ x       : num [1:2238320] 0 0 0 0 0 0 0 0 0 1 ...
  ..@ factors : list()

Примечательно, что ваша строка 2 ничего не делает в моем примере, потому что W %*% W возвращает только 1 и 0.

person Craig    schedule 28.10.2015