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

特征稀疏解算器错误结果

许明朗
2023-03-14

我试图解决一个稀疏线性系统Ax=B与Eigen库在C,然而下面的微不足道的例子似乎给出了一个不正确的解决方案:

#include <Eigen/SparseCholesky>
#include <Eigen/Dense>
#include <Eigen/Sparse>
#include <iostream>
#include <vector>

using namespace std;
using namespace Eigen;

int main(){

    SimplicialLDLT<SparseMatrix<double>> solver;
    SparseMatrix<double> A(9,9);
    typedef Triplet<double> T;
    vector<T> triplet;
    VectorXd B(9);

    for(int i=0; i<4; i++){
        triplet.push_back(T(i,i,1));
        triplet.push_back(T(i+5,i+5,1));
    }

    triplet.push_back(T(4,1,-1));
    triplet.push_back(T(4,3,-1));
    triplet.push_back(T(4,5,-1));
    triplet.push_back(T(4,7,-1));
    triplet.push_back(T(4,4,4));

    A.setFromTriplets(triplet.begin(),triplet.end());
    B << 0,0,0,0,0.387049,0,0,0,0;

    solver.compute(A);
    VectorXd x = solver.solve(B);

    cout << "A\n" << A << "\n";
    cout << "B\n" << B << "\n";
    cout << "x\n" << x << "\n";

    return 0;
}

我没有看到任何错误,算法返回“0”表示“成功”,但我得到的解决方案是

x = 0 0.193524 0 0.193524 0.193524 0 0 0 0

这显然不是这个系统的解决方案,正确的方法是

x = 0 0 0 0 0.0967621 0 0 0 0

共有1个答案

刁英朗
2023-03-14

这里是SimplicialLDLT求解器的留档:

这个类提供了一个LDL^T Cholesky分解,它没有自伴正定稀疏矩阵的平方根。

当矩阵在元素中存储实数时,自伴==对称。你的矩阵显然是不对称的。此外,并非每个对称矩阵都是正定的,参见示例。

简而言之,您选择的解算器仅适用于非常狭窄的矩阵类。正如您已经发现的,SparseLUsolver适用于您的输入数据。

共轭梯度求解器也不起作用,它不要求矩阵是正定的,但它要求矩阵是自伴随的。

 类似资料:
  • 这个例子展示了如何使用 scikit-learn 中的单词包方法,根据主题对文档进行分类。本例使用scipy.sparse中的矩阵来存储特征,并演示各种能够有效处理稀疏矩阵的分类器。 本例中使用的数据集是20条新闻组数据集。通过scikit-learn可以自动下载该数据集,并进行缓存。 下述条形图展示了各个不同分类器,其信息包括精度、训练时间(已归一化)和测试时间(已归一化)。 import lo

  • 我正在用Eigen 3将一个MATLAB代码移植到C,我决定构造我的线性解算器,而不是从矩阵对象调用它,这样我就可以重用它了。不幸的是,它没有产生预期的结果。经过几次测试后,我将问题追溯到了似乎是线性解算器对象的地方,如以下相关代码所示: 结果是: 该算法在MATLAB中的第一次迭代产生了一个近似单位矩阵,可以在C中通过反转矩阵并从矩阵对象调用解算器来观察该矩阵。 但使用解算器对象时,结果完全错误

  • 稀疏数组核心 第一行表示了稀疏数组的组成核心,稀疏数组一共只有三列 第一行第一列表示数组一共有多少行,第一行第二列表示数组一共有多少行,第一行第三列表示数组中有多少个特殊值 从第一行之后的所有行表示数据行,第一列表示数据所在的行数,第二列表示数据坐在的列数,第三列表述具体数据的值 def get_sparse_arr(arr: 'sparse_arr') -> 'sparse_arr':

  • 请看示例代码(注意 data 的数组下标): -- http://www.kyne.com.au/~mark/software/lua-cjson.php -- version: 2.1 devel local json = require("cjson") local data = {1, 2} data[1000] = 99 -- ... do the other things ngx.

  • 我正在使用Jax-RS和Jooq。我想知道如何使用稀疏数据实现REST补丁。 比如说我有一些PoJo。我得到了一个JSON补丁(http://www.restapitutorial.com/lessons/httpmethods.html)请求的对象不完整,只包含应该更改的字段。 我该如何编写这样的处理程序? 我试着接受真实的Pojo对象。我的第一个想法是“如果一个字段为空,我就不更新它”。这是我

  • 问题内容: 也就是说,如果我将当前时间用作数组的索引: 解释器将实例化从0到现在的所有元素吗?不同的浏览器会做不同的事情吗? 我记得AIX内核中曾经存在一个错误,该错误会在请求时创建伪tty,但是如果您说“ echo> / dev / pty10000000000”,它将创建/ dev / pty0,/ dev / pty1, ....然后跌倒死亡。在贸易展览会上这很有趣,但是我不希望这种情况发生