如何高效识别并可视化极稀疏Matlab矩阵中的块结构
3072×3072稀疏矩阵结构识别与可视化方案
全局可视化(替代Excel逐行绘图)
直接生成稀疏矩阵非零元素分布的全局视图,3072规模完全无压力,几秒就能出结果:
- 如果你已经把数据存为scipy稀疏矩阵格式,直接调用matplotlib的spy方法即可:
import matplotlib.pyplot as plt plt.spy(your_sparse_matrix, markersize=1) plt.show() - 如果你只有提取好的非零行、列索引,直接用散点图绘制即可,不需要转矩阵格式:
import matplotlib.pyplot as plt # row_list是所有非零元素的行索引列表,col_list是对应的列索引列表 plt.scatter(col_list, row_list, s=1) plt.gca().invert_yaxis() # 保证行序和矩阵定义一致 plt.show()
绘制出来的图里高亮区域就是非零块,纯黑区域是零块,结构化块的边界一眼就能识别,不用逐行拆分统计。
结构化块自动识别
如果需要定量提取块的坐标、自动划分块区域,用以下方法即可:
- 矩阵重排优化结构显示:如果原始矩阵的块是分散的,用Cuthill-McKee算法重排行列顺序,可以把分散的同属块的行/列自动聚拢,重排后再绘制视图,结构会清晰很多,scipy有现成实现:
scipy.sparse.csgraph.reorder_cuthill_mckee() - 块边界自动检测:对你已经整理好的每行非零列索引,批量做两步统计即可:
- 对每行统计非零列的连续区间,相邻行的连续区间重合度高于阈值的,归为同一个行块
- 对同一个行块内的所有非零列索引做密度聚类,连续高密度的列区间就是列块边界
整个逻辑写出来不到50行代码,跑完只需要几秒,就能输出所有结构化块的行、列范围。
- 如果你不想自己写逻辑,直接用谱聚类对非零元素的邻接矩阵做聚类,也能自动划分出所有块区域,scikit-learn有现成的谱聚类实现可以直接调用。
效率说明
3072×3072的稀疏矩阵哪怕非零元素占比到10%也只有不到100万数据点,上述所有操作在普通家用电脑上跑完都不会超过10秒,完全不需要手动逐行处理。
内容的提问来源于stack exchange,提问作者Bill maher
相关产品推荐
相关产品推荐

