以下是从Matlab获取稀疏矩阵的C ++代码。
#include "mex.h"
#include <Eigen/Sparse>
#include<iostream>
using namespace Eigen;
using namespace std;
void mexFunction( int nlhs, mxArray *plhs[],
int nrhs, const mxArray *prhs[]) {
mwSize m = mxGetM (prhs[0]);
mwSize n = mxGetN (prhs[0]);
mwSize nz = mxGetNzmax (prhs[0]);
double * pr = mxGetPr (prhs[0]);
int * ir = (int*) mxGetIr (prhs[0]);
int * jc = (int*) mxGetJc (prhs[0]);
Map<SparseMatrix<double> > gmap (m, n, nz, jc, ir, pr);
cout << gmap.coeffRef(0,0);
cout << gmap.coeffRef(0,1)<< "\n";
cout << gmap.coeffRef(1,0);
cout << gmap.coeffRef(1,1)<< "\n";
}
我只是传递一个小的稀疏格式2x2矩阵并打印输入。为什么条目错了?这是Matlab命令窗口的输出:
>> a=magic(2)
a =
1 3
4 2
>> example(sparse(a))
11
13
更新:感谢评论中的建议。我会发一个答案。
答案 0 :(得分:0)
我已根据评论中的建议更新了代码,现在可以使用了。
我已将int *更改为mwIndex *。
我复制了mwIndex *数组ir和jc数组,将每个条目重新转换为int,以便它与Eigen兼容。这成功编译。以下是修订后的工作代码:
#include "mex.h"
#include <Eigen/Sparse>
#include<iostream>
using namespace Eigen;
using namespace std;
void mexFunction( int nlhs, mxArray *plhs[],
int nrhs, const mxArray *prhs[]) {
mwSize m = mxGetM (prhs[0]);
mwSize n = mxGetN (prhs[0]);
mwSize nz = mxGetNzmax (prhs[0]);
double * pr = mxGetPr (prhs[0]);
mwIndex * ir = mxGetIr (prhs[0]);
mwIndex * jc = mxGetJc (prhs[0]);
//copy and cast mwIndex
int* ir_int=(int*)mxMalloc(nz*sizeof(int));
int* jc_int=(int*)mxMalloc(nz*sizeof(int));
for (int ii=0;ii<nz;ii++){
ir_int[ii]=(int) ir[ii];
jc_int[ii]=(int) jc[ii];
}
Map<SparseMatrix<double> > gmap (m, n, nz, jc_int, ir_int, pr);
cout << gmap.coeffRef(0,0);
cout << gmap.coeffRef(0,1)<< "\n";
cout << gmap.coeffRef(1,0);
cout << gmap.coeffRef(1,1)<< "\n";
}
魔法(2)
ans =
1 3
4 2
例(稀疏(魔(2))) 13 42