2014-01-13 6 views
1

я могу определить sparse Matrix с использованием вектора для I, J и х:Extract я и J из разреженной матрицы

i <- c(1,3:8) 
j <- c(2,9,6:10) 
x <- 7 * (1:7) 
(A <- sparseMatrix(i, j, x = x)) 

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

i <- [email protected] + 1 
x <- [email protected] 

(Обратите внимание, что порядок г и х изменилось, но их относительное объединение одно и то же: я = 4 все еще находится в том же месте, х = 21)

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

Как можно преобразовать [email protected] и [email protected] в начало j элемент, используемый для определения матрицы?

ответ

4

Немного сложно понять, как хранятся столбцы. У меня трудно объяснить, но, возможно, код поможет вам получить то, что происходит:

# Rows 
[email protected]+1 
# [1] 1 4 5 6 3 7 8 

# Cols (a little tricky..) 
findInterval(seq([email protected])-1,[email protected][-1])+1 
# [1] 2 6 7 8 9 9 10 

# Values 
[email protected] 
# [1] 7 21 28 35 14 42 49 

Итак, после того, как вы удалите первый элемент, [email protected] имеет один элемент для каждого столбца. Диапазон [email protected]+1 - 1:length([email protected]). В принципе, для каждого столбца говорится, что первый элемент [email protected], который встречается в этом столбце, находится по этому индексу [email protected]. Но сложная часть состоит в том, что если ничего не найдено, то в этой колонке находится, затем он использует индекс последнего столбца. Это мое плохое объяснение ... надеюсь, это поможет в сочетании с кодом.

+0

Спасибо! Если я делаю 'j <- findInterval (seq (A @ x) -1, A @ p [-1]) + 1' then' (B <- sparseMatrix (i, j, x = x)) 'then' all .equal (A, B) 'Я верю. Я проверил это на некоторых других объектах 'dgCMatrix', и этот метод работает. Спасибо! – Zach

+0

Хм, я просто думал об этом, и могут возникнуть проблемы с кодом с матрицами с 0 или 1 элементом (ов), поэтому, если вы пишете код для этого, вам может понадобиться изучить угловые случаи. – nograpes

+0

сделаю. К счастью, в моем случае использование матриц имеет миллионы элементов. Если матрица отображается с 0 или 1 элементом, скрипт вернет ошибку, даже если пройдет несколько первых строк. – Zach

1

Намного проще с объектом TsparseMatrix:

A <- as(A, "TsparseMatrix") 
8 x 10 sparse Matrix of class "dgTMatrix" 

[1,] . 7 . . . . . . . . 
[2,] . . . . . . . . . . 
[3,] . . . . . . . . 14 . 
[4,] . . . . . 21 . . . . 
[5,] . . . . . . 28 . . . 
[6,] . . . . . . . 35 . . 
[7,] . . . . . . . . 42 . 
[8,] . . . . . . . . . 49 
> dput(A) 
new("dgTMatrix" 
    , i = c(0L, 3L, 4L, 5L, 2L, 6L, 7L) 
    , j = c(1L, 5L, 6L, 7L, 8L, 8L, 9L) 
    , Dim = c(8L, 10L) 
    , Dimnames = list(NULL, NULL) 
    , x = c(7, 21, 28, 35, 14, 42, 49) 
    , factors = list() 
) 

Можно также создавать, но нужно указать размеры:

(A <- spMatrix(8,10, i=i, j=j, x = x)) 
Смежные вопросы