【问题标题】:Sparse matrix, left matrix divide in C++稀疏矩阵,C ++中的左矩阵除法
【发布时间】:2016-12-07 17:13:29
【问题描述】:

我有两个稀疏矩阵 A 和 B,我想将 X 计算为 X = A\B 也是方程 A*X = B 的相同解
是否有 C++ 中具有此功能的库?我尝试了 Eigen 和 SparseLU 求解器,但是在处理非常大的稀疏矩阵((6 * 6)百万)时,它花费了太多时间,比 Matlab 长得多。
有什么想法吗?
编辑:
这是Eigen和OpenCV中的解决sn-p,矩阵本来是图像,输出也是图像,sn-p中的B或EIN最好是密集的但我不能这样做在Eigen

Eigen::SparseLU<Eigen::SparseMatrix<float>> Solver;
EA.makeCompressed();
Solver.compute(EA);
if (Solver.info() != Eigen::Success) std::cout << Solver.lastErrorMessage() << std::endl;
else std::cout << "Success !" << std::endl;
cv::SparseMat IN(MatTraverse(Image));
Eigen::SparseMatrix<float> EIN = SparseCV2Eigen(IN);
Eigen::SparseMatrix<float> OUT = Solver.solve(EIN);
Eigen::MatrixXf OUTM(OUT);
OUTM.resize(Image.cols,Image.rows);
cv::Mat CVOUT(OUTM.rows(), OUTM.cols(), CV_32F, OUTM.data());

另外,同样的方程可以在 Matlab 中使用 X = A\B 以更快的速度求解

【问题讨论】:

  • 这类问题在这里明确离题。从此help center article 中读取第 4 点。
  • 您能否显示minimal reproducible example 以及您的编译器标志?
  • 展示你尝试过的东西,可能有人可以帮助你实现它
  • 确保您在编译时启用了编译器优化。另外,矩阵对称吗?
  • @AbdarhmanTaha:我的意思是,如果你想用 X 相乘,例如,`X*y`,你可以计算:luA.solve(B*y)(假设 luA 是 LU 分解A.

标签: c++ sparse-matrix eigen


【解决方案1】:

试试这个: http://arma.sourceforge.net/docs.html#operators

它有很多矩阵运算符:

运算符:+ - * / % == != = Mat、Col、Row 和 Cube 类的重载运算符

含义:

  • 添加两个对象 −
    从一个对象中减去另一个对象或否定一个对象

/
一个对象被另一个对象或标量按元素划分 *
两个对象的矩阵乘法;不适用于 Cube 类,除非将一个立方体乘以一个标量

%
舒尔积:两个对象的元素乘法

==
两个对象的元素平等评估;生成一个 umat 类型的矩阵,其条目指示在给定位置来自两个对象的两个元素是否相等 (1) 或不相等 (0) !=
两个对象的元素不等式评估

=
至于==,但检查的是“大于或等于” 至于==,不过检查的是“小于等于”

至于 ==,但检查的是“大于” 至于==,但检查的是“小于”

【讨论】:

  • 问题根本不在于元素操作。如果 arma 提供稀疏求解器(右侧稀疏),则答案可能是相关的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-07-02
  • 2011-11-20
  • 2018-01-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-26
相关资源
最近更新 更多