艾根·雅各比 SVD
Eigen Jacobi SVD
我正在尝试用Eigen
计算SVD(奇异值分解(。 C
是一个秩为 15 的 27x18 矩阵。
JacobiSVD<MatrixXd> svd( C, ComputeFullV | ComputeFullU );
cout << svd.computeU() << endl;
cout << svd.computeV() << endl;
MatrixXd Cp = svd.matrixU() * svd.singularValues().asDiagonal() * svd.matrixV().transpose();
MatrixXd diff = Cp - C;
PRINT_MAT( "diff", diff );
PRINT_MAT
只是一个cout
.令人惊讶的是,我看到 diff 的一些值是非常大的数字,类似于 4.0733184565807887e+250
.
我会做错什么吗?
如果您查看矩阵元素的大小,您会注意到svd.matrixU()
是 18x18,svd.singularValues()
是 18,svd.matrixV()
是 27x27。当你写svd.matrixU() * svd.singularValues().asDiagonal()
结果是一个 18x18 矩阵,它不能乘以svd.matrixV()
。您已经定义了禁用边界检查的 -DNDEBUG。您看到的随机数是分配前内存中的内容。您可以使用以下代码解决此问题:
MatrixXd res(C.rows(), C.cols());
res.setZero();
res.topLeftCorner(C.rows(), C.rows()) = (svd.matrixU() * svd.singularValues().asDiagonal());
MatrixXd Cp = res * svd.matrixV().transpose();
MatrixXd diff = Cp - C;
cout << "diff:n" << diff.array().abs().sum();
正如 ggael 指出的那样,您可以要求只计算薄矩阵,如下所示:
#include <Eigen/Core>
#include <Eigen/SVD>
#include <iostream>
using namespace Eigen;
using std::cout;
int main()
{
MatrixXd C;
C.setRandom(27,18);
JacobiSVD<MatrixXd> svd( C, ComputeThinU | ComputeThinV);
MatrixXd Cp = svd.matrixU() * svd.singularValues().asDiagonal() * svd.matrixV().transpose();
MatrixXd diff = Cp - C;
cout << "diff:n" << diff.array().abs().sum() << "n";
return 0;
}
相关文章:
- 有根的二进制搜索树.保留与其父级的链接
- 根中的组合
- 套接字连接"Operation not permitted"错误,甚至使用升压/平发器根.cpp
- 比根<操作员
- 使用根/C++时出错:没有匹配的构造函数来初始化'TTree'
- 在字符数组 (C++/根) 中查找双精度值
- 如何从命令行使用 cmake 为有根的安卓设备制作可执行文件?
- 从网站复制证书,并使用脚本将其添加到受信任的根证书颁发机构
- 可以告诉艾达不要抓住EXCEPTION_ACCESS_VIOLATION吗?
- 从根权限进程创建可访问的文件
- 提升图库示例 凯文培根的六度:示例中的 Vertex() 是什么
- 当包含头文件的文件不在根项目文件夹中时,如何包含它
- 如何遍历几个每小时一次的根(.root)文件,并将它们组合成更大的每日数据.root文件?
- 为什么我的二叉树会覆盖其根的叶子?
- C++没有标准功能的立方体根查找器
- 艾根C++;就地矩阵乘法
- 我可以将艾根·莱文伯格·马夸特与线性方程和常数雅可比矩阵一起使用吗?
- 艾根·雅各比 SVD
- 艾根的胆汁从国会议员中受益吗?
- 记忆在艾根中是如何布局的