【发布时间】:2018-12-07 15:10:38
【问题描述】:
我正在寻找一种有效的算法来识别具有许多 0 条目的矩阵中的块结构。
例如 6×7 矩阵
0.0975 0.9575 0 0 0 0 0
0.2785 0.9649 0 0 0 0 0
0.5469 0.1576 0 0 0 0 0
0 0 0.9706 0.9572 0 0 0
0 0 0 0 0.8235 0.3171 0.0344
0 0 0 0 0.6948 0.9502 0.4387
由三个大小分别为 3×2、1×2 和 2×3 的块组成。
块由一组行和一组列定义。块结构的特点是所有不属于块的条目都为 0。但是,块中也可能存在精确 0 条目。
一个简单的解决方案是始终将整个矩阵声明为一个块;因此,寻求一种解决方案,使块内条目的数量尽可能少。
为了让事情变得更难(或者更容易?),块不必是连续的。上述矩阵的置换版本,
0 0.9572 0 0 0 0 0.9706
0 0 0.0975 0 0 0.9575 0
0.4387 0 0 0.9502 0.6948 0 0
0.0344 0 0 0.3171 0.8235 0 0
0 0 0.2785 0 0 0.9649 0
0 0 0.5469 0 0 0.1576 0
因此也有三块结构,可以描述为:
- 一个包含第 3、4 行和第 1、4、5 列的块,
- 包含第 1 行和第 2、7 列的块,
- 包含第 2、5、6 行和第 3、6 列的块。
我想到的解决方案是:
使用基于连接权重的集群算法。然而,矩阵不必是对称的甚至是正方形的。特定行和特定列之间没有对应关系。
最初定义一个块包含一个(非 0)条目(由其行和列描述),在其行和列中查找非 0 条目并添加相应的列和行,这样迭代地增长,直到没有添加任何行或列;标识一个块。从块中不包含的条目开始执行相同的操作。重复直到没有非 0 条目留下。在这里我怀疑这个算法是否能有效地扩展到一个有很多块的大矩阵。
我正在寻找一种算法,或其他关于算法的想法,而不是实现。但是,一个实现例如欢迎使用 Matlab 或 Python。
【问题讨论】:
-
您能否根据行数和列数说明您需要处理的矩阵的大小?许多?数百?数千?更多?
-
@dmuir,行数为数千,列数为数百。
标签: arrays matrix cluster-analysis