当前位置: 首页 > 知识库问答 >
问题:

矩形矩阵的特征等效于倍频程/MATLAB mldivide

巫健柏
2023-03-14

我用的是Eigen v3。2.7.

我有一个中等大小的矩形矩阵X(170x17)和行向量Y(170x1),我正试图用本征函数求解它们。Octave使用X\Y很好地解决了这个问题,但是Eigen为这些矩阵返回了不正确的值(但不是较小的值)-但是我怀疑这是我使用Eigen的方式,而不是Eigen本身。

auto X = Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic>{170, 17};
auto Y = Eigen::Matrix<T, Eigen::Dynamic, 1>{170};

// Assign their values...

const auto theta = X.colPivHouseholderQr().solve(Y).eval(); // Wrong!

根据Eigen文档,ColPivHouseholderQR解算器适用于一般矩阵,并且非常健壮,但为了确保我也尝试过FullPivHouseholderQR。结果是一致的。

Octave的mldivide是否有一些特殊的魔法需要我为Eigen手动实现?

这个电子表格有两个输入矩阵,加上八度和我的结果矩阵。

替换auto不会有什么不同,我也不希望有什么不同,因为构造不能是一个懒惰的操作,我必须调用。对解算结果进行eval(),因为我对结果矩阵所做的下一件事是获取尾部和头部操作的原始数据(使用.data())。这些块操作结果的表达式模板版本没有。data()member,因此我必须事先强制求值-换句话说,theta已经是具体类型,而不是表达式模板。

(X*θ-Y)的结果。norm()/Y.norm()是:

2.5365e-007

以及(X.transpose()*X*θ-X.transpose()*Y)的结果。norm()/(X.transpose()*Y)。norm()是:

2.80096e-007

由于我目前在基本数值类型中使用单精度浮点数,所以两者几乎都是零。

共有1个答案

焦同
2023-03-14

根据您的验证,您得到的解决方案非常好。如果您想要更高的精度,请使用double浮点数。请注意,默认情况下,MatLab/Octave使用双精度。

此外,也可能是你的问题不是完整的排名,在这种情况下,你的问题允许无限数量的解决方案。ColPivHouse holderQR以某种方式任意选择了一个。在另一方面,ml分区将选择您也可以通过Eigen::BDCSVD(Eigen 3.3)获得的最小范数,或者较慢的Eigen::JacobiSVD

 类似资料:
  • 特殊矩阵——对称矩阵(Symmetric Matrix) 注:压缩存储的矩阵可以分为特殊矩阵和稀疏矩阵。对于那些具有相同元素或零元素在矩阵中分布具有一定规律的矩阵,被称之为特殊矩阵。对于那些零元素数据远远多于非零元素数目,并且非零元素的分布没有规律的矩阵称之为稀疏矩阵。 1. 对称矩阵的概念 元素以主对角线为对称轴对应相等的矩阵。 2. 对称矩阵的特性 对角矩阵都是对称矩阵,对称矩阵必须是方形矩阵

  • 本文向大家介绍C++ Eigen库计算矩阵特征值及特征向量,包括了C++ Eigen库计算矩阵特征值及特征向量的使用技巧和注意事项,需要的朋友参考一下 本文主要讲解利用Eigen库计算矩阵的特征值及特征向量并与Matlab计算结果进行比较。 C++Eigen库代码 计算结果: 最大最小特征值及其索引位置 Matlab 代码 Matlab计算结果 使用sort()函数对特征值排序 主成份分析以及许多

  • 特殊矩阵——三对角矩阵(Tridiagonal Matrix) 注:压缩存储的矩阵可以分为特殊矩阵和稀疏矩阵。对于那些具有相同元素或零元素在矩阵中分布具有一定规律的矩阵,被称之为特殊矩阵。对于那些零元素数据远远多于非零元素数目,并且非零元素的分布没有规律的矩阵称之为稀疏矩阵。 1. 三对角矩阵的概念 三对角矩阵就是对角线、邻近对角线的上下次对角线上有元素,其他位置均为0的矩阵。 三对角矩阵是一种特

  • 本文向大家介绍numpy.linalg.eig() 计算矩阵特征向量方式,包括了numpy.linalg.eig() 计算矩阵特征向量方式的使用技巧和注意事项,需要的朋友参考一下 在PCA中有遇到,在这里记录一下 计算矩阵的特征值个特征向量,下面给出几个示例代码: 在使用前需要单独import一下 官方文档链接:http://docs.scipy.org/doc/numpy/reference/g

  • 着色器语言中通过关键字mat2、mat3、mat4分别声明一个2x2矩阵、3x3矩阵、4x4矩阵,通过内置函数mat2()、mat3()、mat4()分别创建一个2x2矩阵、3x3矩阵、4x4矩阵。 关键字 数据类型 mat2 2x2矩阵,4个元素 mat3 3x3矩阵,9个元素 mat4 4x4矩阵,16个元素 声明变量 关键子mat4声明一个4x4矩阵 mat4 matrix4; 构造函数赋

  • 问题内容: 我正在尝试编写一种算法,用于在给定的子矩阵中查找子矩阵。为了解决这个问题,我编写了以下代码: 这段代码可以正常工作,但是我不确定这是问题的确切解决方案还是可以解决。请提供您的专家意见。提前致谢。 问题答案: 该算法对4×4矩阵和2×2子矩阵进行了硬编码。否则,它看起来像蛮力算法。 我会这样表示: 如果您想要更有效的方法,建议您将它们压扁,如下所示: 并在此序列中搜索以下模式: 使用标准