Переупорядочение столбцов в Big.Matrix

Я впервые пишу вопрос - несмотря на то, что использую этот сайт почти ежедневно (свидетельство очень высокого качества этого ресурса!) - и хотел бы поблагодарить всех, кто вносит свой вклад в этот сайт / сообщество.!

Я работаю с матрицами, размеры которых варьируются от 50 000 х 50 000 до 75 000 х 110 000 и элементы которых имеют тип "double".

Я хочу иметь возможность изменить порядок столбцов в данной матрице, используя упорядоченный список индексов столбцов. Упрощенно, если у меня есть матрица 5x5 и список индексов c(2,3,4,5,1), я хотел бы изменить порядок столбцов матрицы - используя список индексов - так, чтобы 2-й столбец (в оригинале матрица) становится 1-м столбцом, 3-й становится 2-м,..., а 1-й столбец (в исходной матрице) становится 5-м.

Я использую пакет bigmemory (наряду с bigalgebra и biganalytics).


например:

> class(bigVectors)
[1] "big.matrix"
attr(,"package")
[1] "bigmemory"

> dim(bigVectors)
[1] 50063 50063

> bigVectors[1:5,1:8]
         [,1]    [,2]    [,3]    [,4]    [,5]    [,6]      [,7]      [,8]
[1,] 6.849122 3628685 4215452 4141770 3061888 2754133 1619245.8 1624496.9
[2,] 2.229261 4116822 4495117 3283124 2191141 2421961 1738188.9  827422.9
[3,] 1.427122 2998927 3333069 2489058 1993174 2481412 1085911.8  640274.9
[4,] 1.107610 2376016 2985639 1944990 1475600 2237297  767449.9  517435.9
[5,] 1.183439 2392754 2459180 1902757 1353957 1986074  744722.9  498541.9

> class(cvOrder)
[1] "numeric"

> typeof(cvOrder)
[1] "double"

> length(cvOrder)
[1] 50063

> cvOrder[1:10]
[1]  1  3  2  4  6  5  7  8  9 10

> bigVectors_CVS <- as.big.matrix(bigVectors[,cvOrder], type = "double", backingfile = "_CVS.bak", descriptorfile = '_CVS.dsc')

**Error in as.big.matrix(bigVectors[, cvOrder], type = "double", backingfile = "_CVS.bak",  : 
error in evaluating the argument 'x' in selecting a method for function 'as.big.matrix': 
Error in GetCols.bm(x, j) : Too many indices (>2^31-1) for extraction.**

Эта проблема, кажется, вызвана использованием списка для индексов столбцов:

> bigVectors_CVS <- bigVectors[,cvOrder]
**Error in GetCols.bm(x, j) : Too many indices (>2^31-1) for extraction.**

В качестве (плохого) обходного пути я попытался разбить задачу следующим образом:

> bigVectors_CVS_1 <- deepcopy(bigVectors[1:25000,c(colVarSorted$temp)], type = "double", backingfile = "_CVS_1.bak", descriptorfile = '_CVS_1.dsc', shared=TRUE)

> bigVectors_CVS_2 <- deepcopy(bigVectors[25001:50063,c(colVarSorted$temp)], type = "double", backingfile = "_CVS_2.bak", descriptorfile = '_CVS_2.dsc', shared=TRUE)

> bigVectors_CVS <- as.big.matrix(rbind(bigVectors_CVS_1,bigVectors_CVS_2), type = "double", backingfile = "_CVS.bak", descriptorfile = '_CVS.dsc', shared=TRUE)

Кажется, что это "работает", но после того, как он работал без перерыва в течение 15 часов, он был заброшен как слишком неэффективный.

Кстати, я также попытался написать свою собственную функцию переупорядочения столбцов, используя for-loop и cbind(), но и rbind(), и cbind () работают очень медленно с объектами big.matrix и - если решение не решает проблему крайне низкой производительности of c/rbind() - ни одна из этих функций не должна быть частью окончательного решения этой проблемы.

Я также пытался использовать bigmemory::mpermute(), но, похоже, он сортирует только по строкам, что было бы приемлемым решением, если бы я мог получить стабильную и эффективную функцию транспонирования для работы с матрицами размера, рассмотренного здесь; Я попытался использовать bigpca::big.t() для транспонирования со следующей ошибкой:

> system.time(junk <- filebacked.big.matrix(big.t(bigVectors),type = "double", backingfile = "junkME.bak", descriptorfile = 'junkME.dsc'))
0         25%         50%         75%         100%
..................................................
Error in nrow < 1 : 
  comparison (3) is possible only for atomic and list types
Timing stopped at: 55.898 29.395 405.263 

Я использую 64-разрядную версию Ubuntu 13.10 на процессоре Intel Core i7 4960X с платформой 3,60 ГГц x 12 с 64 ГБ ОЗУ и использую версию R 3.0.1 с OpenBLAS.

0 ответов

Другие вопросы по тегам