R或MATLAB:将大型稀疏矩阵转换为块对角矩阵

5

我有一个大型稀疏矩阵,想要重新排列其行或列,将原始矩阵转化为块对角矩阵。请问R或MATLAB中有哪些函数可以实现这个功能?非常感谢。


问题不是非常清楚,但在R中,您可以使用permute包。 - agstudy
从这里开始:https://dev59.com/eG025IYBdhLWcg3whGSx 展示你所拥有的(或尽力展示你所拥有的),并展示你想要它看起来像什么。玩具示例也可以。 - Brandon Bertelsen
首先尝试使用?hclust对数据进行聚类。您可以通过计算ab数组的每一行(列)之间的距离来定义它们之间的距离,例如abs(a-b)。然后,hclust()将返回一个良好的排列,使得每一行(和列)都靠近在相同索引上具有非零值的行。 - Ali
一个更简单的方法是使用pheatmap()pheatmap。它将为您提供块对角矩阵的可视化。 - Ali
4个回答

2

我并不是专门用来测试的,但对于矩阵m,我建议尝试以下方法:

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

如果这种方法不起作用,可以查看help sparkfun中列出的其他函数,看看是否有任何帮助。

1
也许有点晚了,但是既然有可用的命令,这里提供一个简单的方法。如果你有一个矩阵 H 并且需要块对角形式,可以通过以下代码(MATLAB)获得:
[p,q] = dmperm(H);
H(p,q)

这相当于 Dulmage - Mendelsohn 排列。

1

不确定这是否符合您的要求,但在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将它们恢复到矩阵中。


1

R中的seriation包有许多工具可用于解决与此相关的问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接