朱莉娅:ordschur 命令

计算科学 线性代数 本征系统 语言
2021-11-30 00:31:07

我刚开始学习 Julia,对它的掌握还很初步。我正在尝试重新排序 Schur 分解。在 Matlab 中,我可以使用 ordqz 命令,只需要通过传递字符串参数来指定排序。在Julia中,我的理解是这是通过命令中的矩阵选择来实现的

ordschur(S, select)

其中 S 是从获得的 Schur 对象

S=schur(A,B)

但是,我不知道如何指定选择矩阵来控制排序,并且查看 Julia 文档并没有帮助。有人已经用过了吗?能不能举个例子。

提前谢谢了

1个回答

我承认,文档有点简洁。

.. ordschur(Q, T, select) -> Schur

根据返回 Schur 对象A=Q*T*Q'的逻辑数组重新排序实矩阵的 Schur 分解选择的特征值出现在 的前导对角线中,相应的前导列形成相应右不变子空间的正交基。selectFF[:Schur]F[:vectors]

很容易忽略的关键信息是“逻辑数组”:这意味着这select是一个真/假数组。为真的特征值select[i]被置于顶部。例如:

julia> A = randn(3,3);

julia> (T,Q) = schur(A);

julia> S = ordschur(Q,T,[false,true,true]);

julia> T
3x3 Array{Float64,2}:
 2.12232   0.778057  -0.195052
 0.0      -0.162527   0.793454
 0.0       0.0       -1.49427 

julia> S.T
3x3 Array{Float64,2}:
 -0.162527   0.829117  0.7619   
  0.0       -1.49427   0.0711313
  0.0        0.0       2.12232  

第二个和第三个特征值 -0.16 和 -1.49 现在是领先的。另请注意,参数的顺序TQ两个函数之间的顺序不一致(我可能应该为此提交一个错误)。

如果您想将绝对值小于 1 的特征值置于顶部( 的常见用法ordschur,在 Matlab 中通过硬编码的特殊字符串参数实现),您可以使用以下非常惯用的行:

select = abs(eig(T)) .< 1