如何按分块构造来源对numpy.linalg.eig返回的矩阵特征值特征向量排序
分块矩阵特征值/特征向量按构造来源排序方案
你构造的矩阵A属于实对称矩阵,优先使用np.linalg.eigh替代np.linalg.eig进行特征分解,计算效率更高、数值更稳定,且返回的特征值默认均为实数,避免复数精度问题。
要按分块构造来源排序,核心思路是通过特征向量在对应分块维度上的能量占比区分来源,你可以按需调整排序规则,具体实现如下:
完整实现代码
import numpy as np # 你的原始分块矩阵构造逻辑 B = np.zeros((14,14)) C = np.zeros((14,14)) D = np.zeros((14,14)) Ct = C.T A = np.block([[B,C], [Ct, D]]) # 实对称矩阵特征分解,优先用eigh vals, vecs = np.linalg.eigh(A) block_size = B.shape[0] # 计算每个特征向量在左上角B对应维度(前14维)的能量占比 energy_first_block = np.sum(vecs[:block_size, :] ** 2, axis=0) # 自定义排序规则:示例为先按前14维能量从高到低排序,同优先级按特征值升序排序 # 若需要优先按右下角D对应维度排序,可将-energy_first_block替换为-np.sum(vecs[block_size:, :] ** 2, axis=0) sorted_idx = np.lexsort((vals, -energy_first_block)) # 得到排序后的特征值和特征向量 sorted_vals = vals[sorted_idx] sorted_vecs = vecs[:, sorted_idx]
特殊场景适配
如果你必须使用np.linalg.eig做特征分解,由于该接口对实对称矩阵可能返回带极小虚部的特征值/向量,需要先做实数转换再执行排序逻辑:
vals, vecs = np.linalg.eig(A) # 实对称矩阵理论上无虚部,取实部消除浮点误差 vals = np.real(vals) vecs = np.real(vecs) # 后续排序逻辑和上面完全一致
内容的提问来源于stack exchange,提问作者Madlad
相关产品推荐
相关产品推荐

