You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何按分块构造来源对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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 22:06:04