У меня есть большая разреженная матрица, и я хочу переставить ее строки или столбцы, чтобы превратить исходную матрицу в блочно-диагональную матрицу. Кто-нибудь знает, какие функции в R или MATLAB могут это сделать? Большое спасибо.
R или MATLAB: переставьте большую разреженную матрицу в блочно-диагональную матрицу.
Ответы (4)
Я не настроен проверять это, но для матрицы m
я бы попробовал:
p = symrcm(m);
block_m = m(p,p);
Если это не сработает, просмотрите другие функции, перечисленные в help sparfun
, чтобы узнать, не помогут ли они вам.
В пакете seriation
в R есть ряд инструментов для решения проблем, связанных с этим.
Не совсем уверен, что это то, что вы хотите, но в 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.
Может быть, немного поздновато для игры, но, поскольку есть доступные команды, вот простая. Если у вас есть матрица H и требуется диагональная форма блока, вы можете получить ее с помощью следующих строк (MATLAB):
[p,q] = dmperm(H);
H(p,q)
что эквивалентно перестановке Dulmage - Mendelson.
?hclust
. Вы можете определить расстояние между каждой парой строк (столбцов) вашего массива, скажем,a
иb
, просто вычисливabs(a-b)
. Затемhclust()
вернет вам хорошую перестановку, которая помещает каждую строку (и столбец) близко к тем, которые имеют ненулевые значения в тех же индексах. - person Ali   schedule 01.12.2012pheatmap()
пакетаpheatmap
. Это предоставит вам визуализацию вашей блочно-диагональной матрицы. - person Ali   schedule 01.12.2012