2

我想找到密集复矩阵的特征向量分解A

A = V.diag(lambda).V^-1

我只需要少量的特征向量来准确地再现矩阵以满足我的需要,但是我需要对特征值执行一些非平凡的过滤以确定要包含哪些特征向量。对于我的问题,使用奇异值分解是不合适的,因为特征值/特征向量是我想要处理的具有物理意义的结果。

我正在使用scipy.linalg.eig,它只是 lapackZGEEV例程的一个方便的包装器。在数学上,V^-1应该可以从左特征向量的适当缩放版本中获得。我本来希望这比反转V右特征向量矩阵更有效和更稳定

然而,当我比较这两种方法时,似乎在分解矩阵中同时使用左特征向量比使用反转右特征向量准确得多。大概这是某种舍入或截断错误。我不希望反转右特征向量的矩阵,因为它可能非常大(大约 1000 秒),我需要多次重复此操作。

scipy 中是否有一些可用的例程(或 lapack 或其他一些我可以自己包装的例程)可以有效且准确地进行分解?

4

2 回答 2

1

我现在已经意识到可以V^-1从左侧特征向量中获取U,但是诀窍是将 的元素标准化U为 的对应元素V。我正在对自己的列进行规范化U,这是不正确的,但足够接近以至于看起来几乎是正确的。

所以我是正确的,你可以从中得到V^-1U这只是我实施中的一个错误。

于 2012-07-13T02:15:39.907 回答
0

如果我理解正确,您想通过执行乘法重新获得(近似值)A,但例程仅返回 V 本身,并且您不想反转 V。

但是,该例程还返回左特征向量 U 的矩阵,并且有可能(正如您在我的原始答案的评论中指出的那样)从 U 获得 V 的倒数,如下所示:

如果我们计算矩阵 U*A*V 的第ij个元素,那么它必须等于

U_i * lambda_j * V_j

U_i * lambda_i * V_j

其中 U_i 是 U 的第i行,V_j 是 V 的第j列(但是请注意,像 zgeev 这样的 lapack 例程将行向量作为 Fortran 列向量返回)。

因此,矩阵 U*V 是对角线,因此,正如您在自己的答案中所说,您可以通过以下方式构造 V^-1

V^-1_i = U_i / (U_i * V_i)

其中 U 和 V^-1 上的下标表示行,V 上的下标表示列。

于 2012-07-12T09:35:32.673 回答