c++ - C++ 中的英特尔 MKL 稀疏 QR 求解返回未初始化错误

标签 c++ sparse-matrix intel-mkl

尝试使用 mkl_sparse_s_qr_solve 时,我收到全 0 的结果和 SPARSE_STATUS_NOT_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;
}

因此,出于某种原因,我无法用 A 解决,因为它要么认为 A 是空的,要么其他东西未初始化。我不认为 A 是空的(我想检查但没有方便的方法来打印 A)作为矩阵 A 的初始化作为成功的操作返回(我唯一有点怀疑的是行开始 i_b 和行结束 i_e 索引)。

谁能提供一些指导?

最佳答案

这不是您应该使用 mkl_sparse_?_qr_solve 的方式。稀疏系统分 3 个步骤(阶段)解决:

  1. 重新排序。
  2. 因式分解。
  3. 解决。

首先,您必须调用 mkl_sparse_qr_reorder,然后调用 mkl_sparse_?_qr_factorize,然后才调用 mkl_sparse_?_qr_solve:

尝试在mkl_sparse_?_qr_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_sparse_?_qr,它会在一次调用中为您完成所有 3 个步骤。将流程分为三个步骤,为您提供更多自由。例如,如果您想要求解多个具有相同 A 的系统,您可以通过仅调用一次 mkl_sparse_qr_reordermkl_sparse_?_qr_factorize 来节省时间。

没有直接关系,但不要使用 int 代替 MKL_INT。当定义MKL_ILP64时,MKL_INT不是int,而是long long int

关于c++ - C++ 中的英特尔 MKL 稀疏 QR 求解返回未初始化错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56590741/

相关文章:

python - 从具有列索引的元组列表创建一个稀疏矩阵,其中 1

eigenvector - Intel Math Kernel 中的特征值和特征向量计算

c++ - 优化矩阵旋转 - 关于矩阵中心的任意角度

c++ - 如何测试我的迭代器是否等于一个位置

c++ - 在 C++ OpenCV 中使用多个自定义矩阵计算 RGB 图像矩阵

r - 如何在 R 中不通过 Corpus/VCorpus 将稀疏或 simple_triplet_matrix 转换为 tm-package 文档术语矩阵?

fft - Intel Xeon Phi 上的 MKL 3D double 复数 FFT

c++ - 函数参数隐式转换失败

c++ - fwrite 函数不工作

java - 如何使用 RowMatrix.columnSimilarities 的输出