如何解决Eigen C++:为稀疏矩阵映射原始缓冲区
我在为 SparseMatrix 映射原始缓冲区时遇到了一些麻烦。
1 - 对于具有以下代码的非稀疏矩阵情况没有问题:
Eigen::MatrixXd DIFFXX;
new (&DIFFXX) Eigen::Map<Eigen::MatrixXd> (&coeff_diffxx(0,0),coeff_diffxx.xsize(),coeff_diffxx.ysize());
2- 当我想对 SparseMatrix 执行相同类型的操作时失败了
i) 这样:由此产生的 MAA 是完全错误的
Eigen::SparseMatrix<double,Eigen::RowMajor> MAA;
new (&MAA) Eigen::Map< Eigen::SparseMatrix<double,Eigen::RowMajor>> (xsize*ysize,xsize*ysize,3*xsize*ysize,tridiagonalMatrix.outerIndexPtr(),tridiagonalMatrix.innerIndexPtr(),&m_a.m_data[1]);
ii) 或者这样:MAA 不是引用 &m_a.m_data[1]
而是复制它!
Eigen::SparseMatrix<double,Eigen::RowMajor> MAA = Eigen::Map< Eigen::SparseMatrix<double,&m_a.m_data[1]);
我的目标是在 C++ 原始缓冲区上使用稀疏(实际上是三对角线)矩阵执行操作。
感谢您的任何提示。 吕克
解决方法
我终于用MappedSparseMatrix类做到了,这样:
int outerPtr[] = {0,2};
int innerPtr[] = {1,2};
double valsPtr[] = {2.5,3.6};
Eigen::MappedSparseMatrix<double,Eigen::ColMajor,int> mat(5,1,2,outerPtr,innerPtr,valsPtr);
谢谢!
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。