本人目前在编一个项目,要的挺急的
项目中要处理大型的稀疏矩阵运算,因此本人选择用 Eigen 来实现,但是目前编到最关键的运算部分却报错了。小弟不会调,还请高手指点啊!
本人的程序用的是MFC框架来编的,其余还有很多类和Dlg的定义没有粘下来,但是本人前期运行时候检查过,错误不在其他地方。
项目中要处理大型的稀疏矩阵运算,因此本人选择用 Eigen 来实现,但是目前编到最关键的运算部分却报错了。小弟不会调,还请高手指点啊!
本人的程序用的是MFC框架来编的,其余还有很多类和Dlg的定义没有粘下来,但是本人前期运行时候检查过,错误不在其他地方。
#include "stdafx.h" #include "PET Reconstruction.h" #include "MyFile.h" #include "afxdialogex.h" #include "MyPicture.h" #include "LoadFile.h" #include "Algorithm.h" #include "TripleList.h" #include <Eigen/Sparse> using namespace Eigen; void MyFile::OnBnClickedAffirm() { // TODO: 在此添加控件通知处理程序代码 LoadFile LoadFile; MessageBox(_T("Start to load files! It will take times, please wait...")); TripleList SysMtx_TripleList = LoadFile.Load_TripleList(); MessageBox(_T("Load TripleList successed!")); //此处要将 IDC_FilePathName (int) 转换为 CString 型 LoadFile.Load_Image(m_FilePathName); MessageBox(_T("Load Image successed!")); //弹出图片对话框 MyPicture Picture; Picture.DoModal(); //开始进行迭代计算 MessageBox(_T("Start computation, please wait...")); Algorithm Algorithm; //计算系统矩阵列和 std::vector<double> vec_SysMtxColSum(16384); Algorithm.SysMtxColSum(SysMtx_TripleList, vec_SysMtxColSum); //构造系统矩阵 Eigen::SparseMatrix<double> Eigen_SysMtx(16384, 16384); Eigen_SysMtx.setFromTriplets(LoadFile.vec_Triplet.begin(), LoadFile.vec_Triplet.end()); //开始迭代过程 std::vector<double> vec_TemValue(16384, 1); std::vector<double> vec_Result; MessageBox(_T("Nothing goes wrong, please continue...")); vec_Result = Eigen_SysMtx * vec_TemValue;//报错就在这里,编译器显示无匹配的操作符 //这里的 Eigen_SysMtx 是一个由 Eigen 生产的稀疏矩阵; vec_TemValue 如上面的定义,是个 double 类型的向量 vec_Result *= vec_TemValue;//这里也是 }
跪求高手指点啊!小弟这个项目现在要的真的很急
解决方案
30
std::vector 没有不支持矩阵运算,改用 eigen 里面的 Vector 试一下。
30
本人要是没记错的话,这些运算 eigen vector 都支持,具体怎么做,你就看文档吧。