R построение разреженной матрицы

Я читаю инструкции пакета Matrix в R. Но я не мог понять аргумент p в функции:

sparseMatrix(i = ep, j = ep, p, x, dims, dimnames,
         symmetric = FALSE, index1 = TRUE,
         giveCsparse = TRUE, check = TRUE)

Согласно http://stat.ethz.ch/R-manual/R-devel/library/Matrix/html/sparseMatrix.html

p: числовой (целочисленный) вектор указателей, по одному для каждого столбца (или строки), на начальный (отсчитываемый от нуля) индекс элементов в столбце (или строке). Должно быть пропущено ровно одно из i, j или p.

Я решил, что p предназначен для сжатого представления индексов строки или столбца, потому что нецелесообразно иметь несколько элементов в i или j, чтобы иметь одно и то же значение для представления одной строки / столбца. Но когда я попробовал приведенный пример, я все еще не мог понять, как p контролирует, какой элемент x переходит к какой строке / столбцу.

dn <- list(LETTERS[1:3], letters[1:5])
## pointer vectors can be used, and the (i,x) slots are sorted if necessary:
m <- sparseMatrix(i = c(3,1, 3:2, 2:1), p= c(0:2, 4,4,6), x = 1:6, dimnames = dn)

person GorillaInR    schedule 15.11.2013    source источник


Ответы (1)


Просто прочтите немного дальше в ?SparseMatrix, чтобы узнать, как интерпретируется p. (В частности, обратите внимание на "развернутую форму" p.)

Если «i» или «j» отсутствует, тогда «p» должен быть неубывающим целочисленным вектором, первый элемент которого равен нулю. Он обеспечивает сжатое или «указательное» представление индексов строки или столбца, в зависимости от того, что отсутствует. Расширенная форма «p», «rep (seq_along (dp), dp)», где «dp‹ - diff (p) », используется как (на основе 1) индексы строки или столбца.

Вот небольшая функция, которая поможет вам увидеть, что это означает на практике:

pex <- function(p) {
    dp <- diff(p)
    rep(seq_along(dp), dp)
}

## Play around with the function to discover the indices encoded by p.
pex(p = c(0,1,2,3))
# [1] 1 2 3

pex(p = c(0,0,1,2,3))
# [1] 2 3 4

pex(p = c(10,11,12,13))
# [1] 1 2 3

pex(p = c(0,0,2,5))
# [1] 2 2 3 3 3

pex(p = c(0,1,3,3,3,3,8))
# [1] 1 2 2 6 6 6 6 6
person Josh O'Brien    schedule 15.11.2013
comment
Спасибо, понял. Таким образом, значение i-го элемента в p представляет количество x элементов, уже включенных в первые (i-1) -ые столбцы. Другими словами, разница между i-м и (i-1) -м элементами в p является количество x элементов в столбце (i-1) - person GorillaInR; 15.11.2013
comment
@GorillaInR - Ага. Строго говоря, предпоследнее предложение в вашем комментарии неточно, но последнее предложение верное. Так что да, похоже, у вас это есть. - person Josh O'Brien; 16.11.2013
comment
- Если последнее утверждение верно, то предпоследнее утверждение также будет верным: каждое различие - это количество x элементов в соответствующем столбце, тогда сумма первых (i-1) различий = общее количество уже x элементов. включено в первые (i-1) столбцы = значение i-го элемента p - person GorillaInR; 16.11.2013
comment
@GorillaInR - Но посмотрите результаты pex(p = c(10,11,12,13)). - person Josh O'Brien; 16.11.2013
comment
Но p должен начинаться с 0: если i или j отсутствуют, тогда p должен быть неубывающим целочисленным вектором, первый элемент которого равен нулю. В любом случае спасибо за указание на важную часть объяснения p, иначе я бы никогда не понял - person GorillaInR; 16.11.2013
comment
@GorillaInR - Верно. Спасибо, что указали на это. - person Josh O'Brien; 16.11.2013