C++ 英特尔MKL稀疏QR在C++;返回未初始化错误

C++ 英特尔MKL稀疏QR在C++;返回未初始化错误,c++,sparse-matrix,intel-mkl,C++,Sparse Matrix,Intel Mkl,尝试使用mkl\u sparse\u s\u qr\u solve时,我收到所有0的结果和sparse\u status\u NOT\u INITIALIZED的错误状态,这意味着句柄/矩阵为空 我已尝试彻底阅读文档,并打印用于实例化解算所需CSR稀疏矩阵的所有数组,所有数组都包含正确的值 int main() { std::vector<int> i_b(22); std::vector<int> i_e(22); // j, v, and b

尝试使用
mkl\u sparse\u s\u qr\u solve
时,我收到所有0的结果和
sparse\u status\u NOT\u INITIALIZED
的错误状态,这意味着句柄/矩阵为空

我已尝试彻底阅读文档,并打印用于实例化解算所需CSR稀疏矩阵的所有数组,所有数组都包含正确的值

int main() {
    std::vector<int> i_b(22);
    std::vector<int> i_e(22);
    // j, v, and b vectors are just examples.
    // Regardless of the resulting numbers of the solve, I just
    // cannot get the SPARSE_STATUS_NOT_INITIALIZED error to stop
    // for the qr solver.
    std::vector<int> j(44, 0);
    std::vector<float> v(44, 1.0);
    std::vector<float> b(22, 1.0);

    {
        struct IncGenerator {
            int current_;
            IncGenerator(int start) : current_(start) {}
            int operator() () {
                current_ += 2;
                return current_;
            }
        };
        // Fill i_b with {0, 2, 4, ..., 42}
        IncGenerator g(-2);
        std::generate(i_b.begin(), i_b.end(), g);

        // Fill i_e with {2, 4, 6, ..., 44}
        IncGenerator f(0);
        std::generate(i_e.begin(), i_e.end(), f);
    }

    // ...

    // j, v, and b arrays are all the correct values
    // confirmed. The sparse A matrix should have 2 values
    // per row, with 22 rows, and 15 columns.

    int out;
    sparse_matrix_t A;
    out = mkl_sparse_s_create_csr(&A, SPARSE_INDEX_BASE_ZERO, 22, 15, &i_b[0], &i_e[0], &j[0], &v[0]);

    switch (out) {
    case SPARSE_STATUS_SUCCESS:
        std::cout << "Successfully created matrix!" << std::endl;
        break;
    case SPARSE_STATUS_NOT_INITIALIZED:
        std::cout << "Not initialized." << std::endl;
        break;
    case SPARSE_STATUS_ALLOC_FAILED:
        std::cout << "Internal memory allocation failed." << std::endl;
        break;
    default:
        std::cout << "Unknown." << std::endl;
        break;
    }

    std::vector<float> X(22 * 15);
    out = mkl_sparse_s_qr_solve(SPARSE_OPERATION_NON_TRANSPOSE, A, NULL, SPARSE_LAYOUT_COLUMN_MAJOR, 1, &X[0], 15, &asv[0], 22);
    switch (out) {
    case SPARSE_STATUS_SUCCESS:
        std::cout << "Successfully solved!" << std::endl;
        break;
    case SPARSE_STATUS_NOT_INITIALIZED:
        std::cout << "Not initialized." << std::endl;
        break;
    case SPARSE_STATUS_ALLOC_FAILED:
        std::cout << "Internal memory allocation failed." << std::endl;
        break;
    default:
        std::cout << "Unknown." << std::endl;
        break;
    }

    return 0;
}
intmain(){
std::向量i_b(22);
std::向量i_e(22);
//j、v和b向量只是示例。
//不管解的结果是多少,我只是
//无法停止稀疏\u状态\u未\u初始化错误
//对于qr解算器。
std::向量j(44,0);
标准:向量v(44,1.0);
std::载体b(22,1.0);
{
结构增量生成器{
int电流;
IncGenerator(int start):当前值(start){
int运算符()(){
电流_u+=2;
返回电流;
}
};
//用{0,2,4,…,42}填充i_b
增量发生器g(-2);
std::generate(i_b.begin(),i_b.end(),g);
//用{2,4,6,…,44}填充i_e
incf(0);
std::generate(i_e.begin(),i_e.end(),f);
}
// ...
//j、v和b数组都是正确的值
//已确认。稀疏A矩阵应具有2个值
//每行,包含22行和15列。
指出;
稀疏矩阵;
out=mkl_sparse_s_create_csr(&A,sparse_INDEX_BASE_ZERO,22,15,&i_b[0],&i_e[0],&j[0],&v[0]);
开关(输出){
案例(状态)(成功):

std::cout这不是您应该如何使用
mkl\u sparse\u?\qr\u solve
。稀疏系统分三步(阶段)求解:

  • 重新排序
  • 因式分解
  • 解决
  • 首先,您必须调用
    mkl\u sparse\u qr\u reorder
    ,然后调用
    mkl\u sparse\u qr\u factorize
    ,然后才调用
    mkl\u sparse\u qr\u solve

    struct matrix_descr descr;
    descr.type = SPARSE_MATRIX_TYPE_GENERAL;
    out = mkl_sparse_qr_reorder(A, descr);
    switch (out) { ... }
    
    out = mkl_sparse_?_qr_factorize(A, NULL);
    switch (out) { ... }
    
    尝试在
    mkl\u sparse\uqr\u solve
    之前插入以下代码:

    struct matrix_descr descr;
    descr.type = SPARSE_MATRIX_TYPE_GENERAL;
    out = mkl_sparse_qr_reorder(A, descr);
    switch (out) { ... }
    
    out = mkl_sparse_?_qr_factorize(A, NULL);
    switch (out) { ... }
    
    或者只需使用
    mkl\u sparse\u qr
    即可在一次调用中完成所有3个步骤。将过程分为三个步骤可以让您更自由。例如,如果您想用相同的
    a
    解算多个系统,可以通过调用
    mkl\u sparse\u qr\u reorder
    mkl\u sparse\u qr\u factorize
    只有一次


    不直接相关,但不要使用
    int
    而不是
    MKL_int
    。定义
    MKL_ILP64
    时,
    MKL_int
    不是
    int
    ,而是
    long int

    平台?编译器?Windows,visual studio 2019。从马口:“Windows支持的C/C++和Fortran编译器-Microsoft Visual Studio 2017“奇怪的是,MKL的2019版更新4提供了与Visual Studio 2019的集成,而更新3没有,我使用了更新4。这似乎并不缺乏支持。更不用说,所有内容都已编译并运行。从技术上讲,这可能是可行的,因为MS声明它们在VC++142(从2019年开始)和VC++141(VS2017)之间是二进制兼容的。”.但我建议尝试在项目中使用v141编译器,看看它是否有用。我明白了,我现在就试试。谢谢!我不知道。这很有效。非常感谢!(作为旁白,还必须对行索引进行一些更改)