R или MATLAB: переставьте большую разреженную матрицу в блочно-диагональную матрицу.

У меня есть большая разреженная матрица, и я хочу переставить ее строки или столбцы, чтобы превратить исходную матрицу в блочно-диагональную матрицу. Кто-нибудь знает, какие функции в R или MATLAB могут это сделать? Большое спасибо.


person user1867277    schedule 30.11.2012    source источник
comment
вопрос не совсем ясен, но в R можно использовать permute package.   -  person agstudy    schedule 30.11.2012
comment
Начните здесь: stackoverflow .com/questions/5963269/ покажите нам, что у вас есть (или сделайте все возможное, чтобы показать нам, что у вас есть) и покажите нам, как вы хотите, чтобы это выглядело впоследствии. Примеры игрушек просто прекрасны.   -  person Brandon Bertelsen    schedule 30.11.2012
comment
Попробуйте сначала сгруппировать данные, используя ?hclust. Вы можете определить расстояние между каждой парой строк (столбцов) вашего массива, скажем, a и b, просто вычислив abs(a-b). Затем hclust() вернет вам хорошую перестановку, которая помещает каждую строку (и столбец) близко к тем, которые имеют ненулевые значения в тех же индексах.   -  person Ali    schedule 01.12.2012
comment
Более простым методом было бы использование pheatmap() пакета pheatmap. Это предоставит вам визуализацию вашей блочно-диагональной матрицы.   -  person Ali    schedule 01.12.2012


Ответы (4)


Я не настроен проверять это, но для матрицы m я бы попробовал:

p = symrcm(m);
block_m = m(p,p);

Если это не сработает, просмотрите другие функции, перечисленные в help sparfun, чтобы узнать, не помогут ли они вам.

person Pursuit    schedule 30.11.2012

В пакете seriation в R есть ряд инструментов для решения проблем, связанных с этим.

person Glen_b    schedule 01.12.2012

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

A=full(A);

Потом:

blockedmatrix = mat2cell(A, (n*ones(1,size(A,1)/n)), ...
(n*ones(1,size(A,1)/n))); %found somewhere on internetz

Это возвращает ячейку, где каждая запись имеет размер nxn. Легко извлекать интересующие блоки, манипулировать ими, а затем восстанавливать их в матрицу с помощью cell2mat.

person johnish    schedule 01.12.2012

Может быть, немного поздновато для игры, но, поскольку есть доступные команды, вот простая. Если у вас есть матрица H и требуется диагональная форма блока, вы можете получить ее с помощью следующих строк (MATLAB):

[p,q] = dmperm(H);
H(p,q)

что эквивалентно перестановке Dulmage - Mendelson.

person thanasissdr    schedule 21.05.2015