我刚开始学习 Julia,对它的掌握还很初步。我正在尝试重新排序 Schur 分解。在 Matlab 中,我可以使用 ordqz 命令,只需要通过传递字符串参数来指定排序。在Julia中,我的理解是这是通过命令中的矩阵选择来实现的
ordschur(S, select)
其中 S 是从获得的 Schur 对象
S=schur(A,B)
但是,我不知道如何指定选择矩阵来控制排序,并且查看 Julia 文档并没有帮助。有人已经用过了吗?能不能举个例子。
提前谢谢了
我刚开始学习 Julia,对它的掌握还很初步。我正在尝试重新排序 Schur 分解。在 Matlab 中,我可以使用 ordqz 命令,只需要通过传递字符串参数来指定排序。在Julia中,我的理解是这是通过命令中的矩阵选择来实现的
ordschur(S, select)
其中 S 是从获得的 Schur 对象
S=schur(A,B)
但是,我不知道如何指定选择矩阵来控制排序,并且查看 Julia 文档并没有帮助。有人已经用过了吗?能不能举个例子。
提前谢谢了
我承认,文档有点简洁。
.. 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 现在是领先的。另请注意,参数的顺序T和Q两个函数之间的顺序不一致(我可能应该为此提交一个错误)。
如果您想将绝对值小于 1 的特征值置于顶部( 的常见用法ordschur,在 Matlab 中通过硬编码的特殊字符串参数实现),您可以使用以下非常惯用的行:
select = abs(eig(T)) .< 1