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编译器,看看它是否有用。我明白了,我现在就试试。谢谢!我不知道。这很有效。非常感谢!(作为旁白,还必须对行索引进行一些更改)