在 Eigen3 中实现 Bartels–Stewart 算法?

2024-01-13

过去当我需要解西尔维斯特方程时AX + XB = C,我用过scipy的函数,solve_sylvester[1],它显然是通过使用 Bartels-Stewart 算法将事物转化为上三角形式,然后使用lapack.

我现在需要使用以下方法求解方程eigen. eigen提供一个函数,matrix_function_solve_triangular_sylvester[2],从文档来看,它类似于lapack函数其中scipy来电。我正在尝试准确翻译scipy的实现在eigen3,但最终我的价值X不满足方程。这是我的实现:

#include <iostream>

#include <Eigen/Core>
#include <Eigen/Eigenvalues>
#include <unsupported/Eigen/MatrixFunctions>

int main()
{

  Eigen::Matrix<double, 3, 3> A;
  A << -17,  -6,  0,
       -15,   6,  14,
         9, -12,  19;

  Eigen::Matrix<double, 5, 5> B;
  B << 5, -17, -12,  16,  11,
      -4,  19,  -1,   9,  13,
       1,   3,   5,  -5,   2,
       8, -15,   5,  14, -12,
      -2,  -4,  13,  -8, -17;

  Eigen::Matrix<double, 3, 5> Q;
  Q <<   6,   5, -17,  12,   4,
       -11,  15,   8,   1,   7,
        15,  -3,   9, -19, -10;

  Eigen::RealSchur<Eigen::MatrixXd> SchurA(A);
  Eigen::MatrixXd R = SchurA.matrixT();
  Eigen::MatrixXd U = SchurA.matrixU();

  Eigen::RealSchur<Eigen::MatrixXd> SchurB(B.transpose());
  Eigen::MatrixXd S = SchurB.matrixT();
  Eigen::MatrixXd V = SchurB.matrixU();

  Eigen::MatrixXd F = (U.transpose() * Q) * V;

  Eigen::MatrixXd Y =
    Eigen::internal::matrix_function_solve_triangular_sylvester(R, S, F);

  Eigen::MatrixXd X = (U * Y) * V.transpose();

  Eigen::MatrixXd Q_calc = A * X + X * B;

  std::cout << Q_calc - Q << std::endl;
  // Should be all zeros, but instead getting:
  // 421.868  193.032 -208.273  42.7449 -3.57527
  //-1651.66 -390.314  2043.59  -1611.1 -1843.91
  //-67.4093  207.414  1168.89 -1240.54 -1650.48

  return EXIT_SUCCESS; 

}

有什么想法我做错了吗?

[1] https://github.com/scipy/scipy/blob/v0.15.1/scipy/linalg/_solvers.py#L23 https://github.com/scipy/scipy/blob/v0.15.1/scipy/linalg/_solvers.py#L23

[2] https://bitbucket.org/eigen/eigen/src/dbb0b1f3b07a261d01f43f8fb94e85ceede9fac7/unsupported/Eigen/src/MatrixFunctions/MatrixFunction.h?at=default#lines-274 https://bitbucket.org/eigen/eigen/src/dbb0b1f3b07a261d01f43f8fb94e85ceede9fac7/unsupported/Eigen/src/MatrixFunctions/MatrixFunction.h?at=default#lines-274


Your A and B矩阵具有非实特征值,因此它们RealSchur分解将是非三角形的(仅是“准三角形”,即它在对角线上包含一个 2x2 块)。如果你编译时没有-DNDEBUG,你应该得到这样的断言:

../eigen/unsupported/Eigen/src/MatrixFunctions/MatrixFunction.h:277: MatrixType Eigen::internal::matrix_function_solve_triangular_sylvester(const MatrixType&, const MatrixType&, const MatrixType&) [with MatrixType = Eigen::Matrix<double, -1, -1>]: Assertion `A.isUpperTriangular()' failed.

我不知道是否有一个西尔维斯特求解器也可以处理准三角矩阵,但使用特征方法的最简单的解决方案是使用ComplexSchur分解(也可使用adjoint()代替transpose()——并且不要转置B):

Eigen::ComplexSchur<Eigen::MatrixXd> SchurA(A);
Eigen::MatrixXcd R = SchurA.matrixT();
Eigen::MatrixXcd U = SchurA.matrixU();

Eigen::ComplexSchur<Eigen::MatrixXd> SchurB(B);
Eigen::MatrixXcd S = SchurB.matrixT();
Eigen::MatrixXcd V = SchurB.matrixU();

Eigen::MatrixXcd F = (U.adjoint() * Q) * V;

Eigen::MatrixXcd Y =
  Eigen::internal::matrix_function_solve_triangular_sylvester(R, S, F);

Eigen::MatrixXcd X = (U * Y) * V.adjoint();

Eigen::MatrixXcd Q_calc = A * X + X * B;

I think X应始终为实数,因此您可以将最后两行替换为

Eigen::MatrixXd X = ((U * Y) * V.adjoint()).real();

Eigen::MatrixXd Q_calc = A * X + X * B;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Eigen3 中实现 Bartels–Stewart 算法? 的相关文章

  • Matlab:获得标准基向量的简单方法?

    看起来这应该很容易 但我不是专家 谷歌也没有帮助 我想要在 Matlab 中以一种优雅的方式为 n 维空间生成标准有序基向量 例如 类似于以下的行为 gt gt e1 e2 SOB 2 gt gt e1 e1 1 0 gt gt e2 e2
  • 对于矩阵向量乘法,行优先排序是否更有效?

    If M是一个 n x m 矩阵并且v and u是向量 那么就索引而言 矩阵向量乘法看起来像u i sum M i j v j 1 lt j lt m Since v是一个向量 对于面向数值计算的语言 其元素可能存储在连续的内存位置中 如
  • Scala 的线性代数库? [复制]

    这个问题在这里已经有答案了 可能的重复 Scala 有好的数学 统计库吗 https stackoverflow com questions 8760925 is there a good math stats library for sc
  • 两个相似的位姿具有较大的相对欧拉角

    欧拉角表示的相似位姿有两种 s euler angle o1 0 000549608 3 1334 1 23193 s euler angle o2 0 0222646 3 10948 1 31032 但 Eigen 计算出的相对欧拉角为
  • 从 Eigen::SparseMatrix 中提取块/ROI,无需复制

    我想知道有没有什么好方法从 Eigen SparseMatrix 中提取块 ROI 更准确地说 我想要提取的是内向量 我想做的是这样的 typedef Eigen SparseMatrix
  • R 中的 QR 分解和 Cholesky 分解

    我最近读到了如何使用 Choleski 分解来计算 QR 分解的 R 矩阵 其关系为 R Cholesky 分解 A TA Example gt A matrix c 1 2 3 2 3 5 1 3 2 nrow 3 gt A 1 2 3
  • Python 中的矩阵求幂

    我正在尝试用 Python 对复杂矩阵求幂 但遇到了一些麻烦 我正在使用scipy linalg expm函数 并且当我尝试以下代码时出现相当奇怪的错误消息 import numpy as np from scipy import lina
  • 主成分分析降维

    我正在努力表演PCA http en wikipedia org wiki Principal component analysis将 900 个维度减少到 10 个 到目前为止 我有 covariancex cov labels V d
  • 通过添加标准基向量来构造满秩矩阵

    我有一个 nxn 奇异矩阵 我想向该矩阵添加 k 行 必须来自标准基础 e1 e2 en 以便新的 n k xn 矩阵具有完整的列秩 添加的行数 k 必须是最小的 并且可以以任何顺序添加 不仅仅是 e1 e2 还可以是 e4 e10 e1
  • 使用 SQL 对表进行“转置”

    我不知道这个运算是否有名称 但它类似于线性代数中的转置 有没有办法将 1 by n 表 T1 转换为 c 1 c 2 c 3 a n 1 2 3 n 放入如下所示的 n 2 表中 key val c 1 1 b 2 2 c 3 3 a n
  • Python 中二维多项式的“polyfit”等价物

    我想找到一个最小二乘解a中的系数 z a0 a1 x a2 y a3 x 2 a4 x 2 y a5 x 2 y 2 a6 y 2 a7 x y 2 a8 x y 给定数组x y and z长度为 20 基本上我正在寻找相当于numpy p
  • 对 qr.Q() 感到困惑:什么是“紧凑”形式的正交矩阵?

    R has a qr 函数 它使用 LINPACK 或 LAPACK 执行 QR 分解 根据我的经验 后者快 5 返回的主要对象是一个矩阵 qr 其中包含上三角矩阵 R 即R qr upper tri qr 到目前为止 一切都很好 qr 的
  • 用 R 求解欠定线性系统

    R 可以求解欠定线性系统 A matrix 1 12 2 3 4 T B 1 3 qr A rank 3 qr solve A B solutions will have one zero not necessarily the same
  • 对角块矩阵行之间的组合列表

    我有以下 R 矩阵 它是 2x3 和 3x3 子矩阵的组合 它可以是 2 个以上具有不同维度的子矩阵 例如 m1xp 和 m2xp 和 m3xp 其中 m1 m2 m3 A2 lt list rbind c 1 1 1 c 1 1 1 rb
  • Java优化的Cramers规则函数

    最近了解了初级微积分中的 Cramers 规则 并决定用 Java 制作一个算法来帮助我更好地理解它 以下代码 100 正确运行 但是它不使用任何类型的 for 循环来以更简单的方式执行其操作 问题 Java 中是否有更优雅的 Cramer
  • 用核心运动计算倾斜角

    我的申请有一个记录会话 当用户开始记录会话时 我开始从设备的 CMMotionManager 对象收集数据并将它们存储在 CoreData 上以供稍后处理和呈现 我正在收集的数据包括 GPS 数据 加速度计数据和陀螺仪数据 数据的频率为10
  • 当 A-lx 是奇异且无解时的特征向量

    R 如何找到以下矩阵的特征向量 特征值是 2 2 所以特征向量需要求解solve matrix c 0 1 0 0 2 2 这是无解的奇异矩阵 gt eigen matrix c 2 1 0 2 2 2 values 1 2 2 vecto
  • 使用 Python 从 3D 中的六个点确定齐次仿射变换矩阵

    我得到了三个点的位置 p1 1 0 1 0 1 0 p2 1 0 2 0 1 0 p3 1 0 1 0 2 0 以及它们转化后的对应物 p1 prime 2 414213562373094 5 732050807568877 0 73205
  • 3D 图形矩阵 4x4 中最后一行的 magic 4 的用途是什么?

    当我阅读有关WebGL的书时 我看到了下一个矩阵描述 有关于书中最后一行的信息 WebGL 初学者指南 初学者指南 Diego Cantor Brandon Jones 神秘的第四排 第四排没有任何特殊之处 意义 元素 m4 m8 m12
  • 有没有快速的矩阵求幂方法?

    Is there any faster method of matrix exponentiation to calculate Mn where M is a matrix and n is an integer than the sim

随机推荐

  • 是否可以自定义 JAXB 在编组到字符串时使用的名称空间前缀?

    例如 我有一个导入另一个架构的简单架构 第二个架构 urn just attributes just attributes xsd 仅定义属性组
  • 通过 jpm 生成签名 XPI 失败

    有问题签署附加组件 https wiki mozilla org Addons Extension Signing via jpm https developer mozilla org en US Add ons SDK Tools jp
  • 通用发送电子邮件 html 或纯文本 php

    几天来 我一直在总结这样一个事实 我可以创建一个发送 HTML 邮件模板的脚本 如果用户的客户端无法读取 HTML 纯文本列表可能无法接收 HTML 电子邮件 请一些关于如何做到这一点的通用建议 我查遍了整个互联网 但我真的不知道 非常感谢
  • 输入类型=“文件”设置base64图像数据

    我有一个画布并在以下命令的帮助下从中检索图像数据canvas toDataURL image png Problem
  • 如何从配置文件中删除白色字符?

    我想使用python修改samba配置文件 这是我的代码 from ConfigParser import SafeConfigParser parser SafeConfigParser parser read etc samba smb
  • 环境变量在 Electron 中未定义,即使它已在 webpack.DefinePlugin 中设置

    我有一个要求 我们需要根据它是在生产环境还是在开发环境中执行来设置 dll 路径 因此 我决定将该值放入环境变量中 并尝试使用 webpack DefinePlugin 来实现 方法一 webpack config json plugins
  • 使 editText 提示变为斜体?

    你如何在 xml 中做到这一点 可以吗 我在 java 代码的相关问题中看到了这一点 检查长度为 0 并且 EditText setText Html fromHtml
  • Angular slickgrid 不显示在动态选项卡(ngx-bootstrap 选项卡集)内

    我正在使用 Angular Slickgrid 在选项卡内显示表格数据 我有一个 html 页面 其中两个选项卡是静态的 也正确显示数据 其他选项卡是从最后的专用选项卡动态创建的 这基本上是从输入构建查询 当您保存选项卡时 它将创建一个新选
  • 通过索引从 List 获取元素是否线程安全

    通过索引从 List 获取元素是线程安全的吗 var list new List
  • 推送到 webroot 之上的托管项目

    我有一个CakePHP应用程序托管于DreamHost 以及我的 MacBook 上的本地克隆 我正在尝试设置我的环境 以便我可以在 MacBook 上进行开发并根据需要推送到托管站点 但不知道如何设置git当远程文件在上面时从本地推送到远
  • 在 C++ 中查看 system() 调用的输出

    如何查看系统命令的输出 前任 int tmain int argc TCHAR argv system set PATH PATH C Program Files x86 myFolder bin system cd C thisfolde
  • Phoenix:如何服务单页应用程序

    我想将 Phoenix 设置为提供静态 index html 无论发送到它的路由是什么 无需更改 URL 同时提供对非 html 资源 js css jpg 的访问 因为我的 SPA 在 Elm 会查看路线并找出要做什么 基于this ht
  • 如何在CakePHP 2.0的控制器中导入类?

    我正在使用 CakePHP 我创建了一个外部类 它不是模型也不是控制器 类的结构如下所示 class UploadImage function sayHello return hahaha 我将该类保存在 App gt Lib 目录中 并将
  • 为什么指令 ng-href 需要 {{}} 而其他指令不需要?

    我只是想知道为什么我需要为 ng href 添加双大括号 而其他一些指令不需要它们 a link a 请注意ng href需要大括号同时ng if没有 我不太确定你的问题 但我认为您想知道为什么角度指令中有不同的语法样式 首先 请大家看一下
  • MongoDB {aggregation $match} 与 {find} 速度

    我有一个包含数百万行的 mongoDB 集合 我正在尝试优化我的查询 我目前正在使用聚合框架来检索数据并根据需要对它们进行分组 我典型的聚合查询类似于 match gt group gt group gt project 然而 我注意到最后
  • Azure Active Directory JWT 公钥更改

    Azure AD 随机更改 JWT 公共令牌而不发出警告 我可以完全关闭该功能吗 我希望公钥永远不会改变 Azure AD 签名密钥会定期轮换 有时也会立即轮换 请查看相关的微软指南 Azure Active Directory 中的签名密
  • 让 Activity 只是一个弹出窗口

    我目前正在制作一个程序 该程序应该提示用户选择要连接的某个蓝牙设备 我通过选项菜单在我的代码中设置了它 我希望它看起来像 BlueTerm 的弹出窗口 我实际上有 BlueTerm 的代码 因为它可以免费查看 但我不知道如何使窗口显示为弹出
  • 为什么 Laravel 中有 2 个 APP Key? .env 和 config/app.php

    我通过 Composer 安装了 Laravel 5 安装后自动生成了 App Key 我去了 env文件 我可以在那里看到 APP KEY 不过 我也注意到里面还有另一个APP KEYconfig app php像这样 key gt en
  • 在 Windows 服务中使用的最佳计时器

    Locked 这个问题及其答案是locked help locked posts因为这个问题是题外话 但却具有历史意义 目前不接受新的答案或互动 我需要创建一些 Windows 服务 它将每 N 时间段执行一次 问题是 我应该使用哪个计时器
  • 在 Eigen3 中实现 Bartels–Stewart 算法?

    过去当我需要解西尔维斯特方程时AX XB C 我用过scipy的函数 solve sylvester 1 它显然是通过使用 Bartels Stewart 算法将事物转化为上三角形式 然后使用lapack 我现在需要使用以下方法求解方程ei