Подтвердить что ты не робот

Создание (и доступ) разреженной матрицы с записями NA по умолчанию

Узнав о параметрах работы с разреженными матрицами в R, я хочу использовать Matrix, чтобы создать разреженную матрицу из следующего фрейма данных и иметь все остальные элементы NA.

     s    r d
1 1089 3772 1
2 1109  190 1
3 1109 2460 1
4 1109 3071 2
5 1109 3618 1
6 1109   38 7

Я знаю, что могу создать разреженную матрицу со следующим: доступ к элементам как обычно:

> library(Matrix)
> Y <- sparseMatrix(s,r,x=d)
> Y[1089,3772]
[1] 1
> Y[1,1]
[1] 0

но если я хочу, чтобы значение по умолчанию было NA, я попробовал следующее:

  M <- Matrix(NA,max(s),max(r),sparse=TRUE)
  for (i in 1:nrow(X))
    M[s[i],r[i]] <- d[i]

и получил эту ошибку

Error in checkSlotAssignment(object, name, value) : 
  assignment of an object of class "numeric" is not valid for slot "x" in an object of class "lgCMatrix"; is(value, "logical") is not TRUE

Не только это, я считаю, что для доступа к элементам требуется гораздо больше времени.

> system.time(Y[3,3])
   user  system elapsed 
  0.000   0.000   0.003 
> system.time(M[3,3])
   user  system elapsed 
  0.660   0.032   0.995 

Как мне создать эту матрицу? Почему одна матрица работает намного медленнее?

Здесь приведен фрагмент кода для вышеуказанных данных:

X <- structure(list(s = c(1089, 1109, 1109, 1109, 1109, 1109), r = c(3772, 
190, 2460, 3071, 3618, 38), d = c(1, 1, 1, 2, 1, 7)), .Names = c("s", 
"r", "d"), row.names = c(NA, 6L), class = "data.frame")
4b9b3361

Ответ 1

Да, ответ Тьерри определенно верен, я могу сказать, как соавтор пакета "Матрица"...

К вашему другому вопросу: почему доступ к "М" медленнее, чем "Y"? Основной ответ заключается в том, что "М" намного реже, чем "Y", поэтому значительно меньше и - в зависимости от размеров и объема оперативной памяти вашей платформы - время доступа быстрее для гораздо меньших объектов, особенно для индексации в них.

Ответ 2

Почему вы хотите значения NA по умолчанию? Насколько я знаю, матрицы разрешены только в том случае, если они имеют нулевые ячейки. Поскольку NA является ненулевым значением, вы теряете все преимущества от разреженной матрицы. Классическая матрица еще более эффективна, если в матрице почти нет нулей. Классическая матрица похожа на вектор, который будет разрезан в соответствии с размерами. Поэтому он должен хранить только вектор данных и размеры. Редкая матрица хранит только ненулевые значения, но также сохраняет там местоположение. Это преимущество тогда и только тогда, когда у вас достаточно нулевых значений.