连续修剪的产品使 EIGEN 崩溃
Successive pruned product crashing EIGEN
我遇到一个错误,我无法理解使用 Eigen 和 SparseMatrix 以及 Visual Studio Pro 2013
连续修剪的产品在 DEBUG 模式下完美运行,但它们很长。我想切换到 RELEASE,而不更改代码中的任何内容,但是程序在这种模式下崩溃了。
我遇到访问冲突错误c0000005
(法语 VS,对此深表歉意):
Message de résultat : Code de l'exception : C0000005
StackTrace de résultat :
à Eigen::internal::sparse_sparse_product_with_pruning_impl<Eigen::SparseMatrix<short,0,int>,Eigen::SparseMatrix<short,0,int>,Eigen::SparseMatrix<short,0,int> >() dans [..]\eigen\src\sparsecore\sparsesparseproductwithpruning.h:ligne 61
à Eigen::internal::sparse_sparse_product_with_pruning_selector<Eigen::SparseMatrix<short,1,int>,Eigen::SparseMatrix<short,1,int>,Eigen::SparseMatrix<short,0,int>,1,1,0>::run() dans [..]\eigen\src\sparsecore\sparsesparseproductwithpruning.h:ligne 143
à Eigen::internal::unary_evaluator<Eigen::SparseView<Eigen::Product<Eigen::SparseMatrix<short,1,int>,Eigen::SparseMatrix<short,1,int>,2> >,Eigen::internal::IteratorBased,short>::unary_evaluator<Eigen::SparseView<Eigen::Product<Eigen::SparseMatrix<short,1,int>,Eigen::SparseMatrix<short,1,int>,2> >,Eigen::internal::IteratorBased,short>() dans [..]\eigen\src\sparsecore\sparseproduct.h:ligne 158
à Eigen::SparseMatrix<short,1,int>::operator=<Eigen::SparseView<Eigen::Product<Eigen::SparseMatrix<short,1,int>,Eigen::SparseMatrix<short,1,int>,2> > >() dans [..]\eigen\src\sparsecore\sparsematrix.h:ligne 1080
à IncMethod_Tester::EigenMatrix_Tests::NullMultiplication() dans [...]\integrity_tests.cpp:ligne 856
integrity_test中测试的代码如下:
SparseMatrix<short, RowMajor> A(0, 1);
SparseMatrix<short, RowMajor> B(1, 5);
SparseMatrix<short, RowMajor> C(5, 4);
std::vector<Triplet<short>> values;
values.push_back(Triplet<short>(0, 4, 1));
values.push_back(Triplet<short>(0, 3, 1));
values.push_back(Triplet<short>(0, 2, 1));
B.setFromTriplets(values.begin(), values.end());
std::vector<Triplet<short>> values2;
values2.push_back(Triplet<short>(0, 0, 1));
values2.push_back(Triplet<short>(1, 1, 1));
values2.push_back(Triplet<short>(2, 2, -1));
values2.push_back(Triplet<short>(2, 3, -1));
values2.push_back(Triplet<short>(3, 2, 1));
values2.push_back(Triplet<short>(4, 3, 1));
C.setFromTriplets(values2.begin(), values2.end());
std::fstream f("NULLMULTIPLICATION", std::fstream::out);
f << "A MATRIX (" << A.rows() << "," << A.cols() << ")" <<std::endl << A << std::endl;
f << "B MATRIX (" << B.rows() << "," << B.cols() << ")" <<std::endl<< B << std::endl;
f << "C MATRIX (" << C.rows() << "," << C.cols() << ")" << std::endl << C << std::endl;
B = (A*B).pruned();
f << "AB MATRIX (" << B.rows() << "," << B.cols() << ")" << std::endl << A << std::endl;
B = (B*C).pruned();
f << "B MATRIX (" << B.rows() << "," << B.cols() << ")" << std::endl << B << std::endl;
NULLMULTIPLICATION
文件中的输出是:
A MATRIX (0,1)
B MATRIX (1,5)
0 0 1 1 1
C MATRIX (5,4)
1 0 0 0
0 1 0 0
0 0 -1 -1
0 0 1 0
0 0 0 1
AB MATRIX (0,5)
这意味着程序 运行 最多 :
B = (A*B).pruned();
B = (B*C).pruned();
我是不是做错了什么?我尝试创建临时变量,但它仍然崩溃:
SparseMatrix<short, RowMajor> D = (A*B).pruned();
SparseMatrix<short, RowMajor> E = (D*C).pruned();
对此产品有什么建议吗?我可能对多个稀疏产品的语法有误?
提前致谢。
好的,我找到了导致错误的原因。这是由于修剪产品中的 0 维,我只是通过在产品之前测试是否涉及的任何矩阵具有空维来解决它,如果是这样,则只做一个没有修剪的普通产品。
我遇到一个错误,我无法理解使用 Eigen 和 SparseMatrix 以及 Visual Studio Pro 2013
连续修剪的产品在 DEBUG 模式下完美运行,但它们很长。我想切换到 RELEASE,而不更改代码中的任何内容,但是程序在这种模式下崩溃了。
我遇到访问冲突错误c0000005
(法语 VS,对此深表歉意):
Message de résultat : Code de l'exception : C0000005
StackTrace de résultat :
à Eigen::internal::sparse_sparse_product_with_pruning_impl<Eigen::SparseMatrix<short,0,int>,Eigen::SparseMatrix<short,0,int>,Eigen::SparseMatrix<short,0,int> >() dans [..]\eigen\src\sparsecore\sparsesparseproductwithpruning.h:ligne 61
à Eigen::internal::sparse_sparse_product_with_pruning_selector<Eigen::SparseMatrix<short,1,int>,Eigen::SparseMatrix<short,1,int>,Eigen::SparseMatrix<short,0,int>,1,1,0>::run() dans [..]\eigen\src\sparsecore\sparsesparseproductwithpruning.h:ligne 143
à Eigen::internal::unary_evaluator<Eigen::SparseView<Eigen::Product<Eigen::SparseMatrix<short,1,int>,Eigen::SparseMatrix<short,1,int>,2> >,Eigen::internal::IteratorBased,short>::unary_evaluator<Eigen::SparseView<Eigen::Product<Eigen::SparseMatrix<short,1,int>,Eigen::SparseMatrix<short,1,int>,2> >,Eigen::internal::IteratorBased,short>() dans [..]\eigen\src\sparsecore\sparseproduct.h:ligne 158
à Eigen::SparseMatrix<short,1,int>::operator=<Eigen::SparseView<Eigen::Product<Eigen::SparseMatrix<short,1,int>,Eigen::SparseMatrix<short,1,int>,2> > >() dans [..]\eigen\src\sparsecore\sparsematrix.h:ligne 1080
à IncMethod_Tester::EigenMatrix_Tests::NullMultiplication() dans [...]\integrity_tests.cpp:ligne 856
integrity_test中测试的代码如下:
SparseMatrix<short, RowMajor> A(0, 1);
SparseMatrix<short, RowMajor> B(1, 5);
SparseMatrix<short, RowMajor> C(5, 4);
std::vector<Triplet<short>> values;
values.push_back(Triplet<short>(0, 4, 1));
values.push_back(Triplet<short>(0, 3, 1));
values.push_back(Triplet<short>(0, 2, 1));
B.setFromTriplets(values.begin(), values.end());
std::vector<Triplet<short>> values2;
values2.push_back(Triplet<short>(0, 0, 1));
values2.push_back(Triplet<short>(1, 1, 1));
values2.push_back(Triplet<short>(2, 2, -1));
values2.push_back(Triplet<short>(2, 3, -1));
values2.push_back(Triplet<short>(3, 2, 1));
values2.push_back(Triplet<short>(4, 3, 1));
C.setFromTriplets(values2.begin(), values2.end());
std::fstream f("NULLMULTIPLICATION", std::fstream::out);
f << "A MATRIX (" << A.rows() << "," << A.cols() << ")" <<std::endl << A << std::endl;
f << "B MATRIX (" << B.rows() << "," << B.cols() << ")" <<std::endl<< B << std::endl;
f << "C MATRIX (" << C.rows() << "," << C.cols() << ")" << std::endl << C << std::endl;
B = (A*B).pruned();
f << "AB MATRIX (" << B.rows() << "," << B.cols() << ")" << std::endl << A << std::endl;
B = (B*C).pruned();
f << "B MATRIX (" << B.rows() << "," << B.cols() << ")" << std::endl << B << std::endl;
NULLMULTIPLICATION
文件中的输出是:
A MATRIX (0,1)
B MATRIX (1,5)
0 0 1 1 1
C MATRIX (5,4)
1 0 0 0
0 1 0 0
0 0 -1 -1
0 0 1 0
0 0 0 1
AB MATRIX (0,5)
这意味着程序 运行 最多 :
B = (A*B).pruned();
B = (B*C).pruned();
我是不是做错了什么?我尝试创建临时变量,但它仍然崩溃:
SparseMatrix<short, RowMajor> D = (A*B).pruned();
SparseMatrix<short, RowMajor> E = (D*C).pruned();
对此产品有什么建议吗?我可能对多个稀疏产品的语法有误?
提前致谢。
好的,我找到了导致错误的原因。这是由于修剪产品中的 0 维,我只是通过在产品之前测试是否涉及的任何矩阵具有空维来解决它,如果是这样,则只做一个没有修剪的普通产品。