Переупорядочение столбцов в 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.