为什么我的mexed本征代码打印出错误的矩阵条目?

时间:2018-04-23 18:29:11

标签: matlab sparse-matrix eigen mex

以下是从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

更新:感谢评论中的建议。我会发一个答案。

1 个答案:

答案 0 :(得分:0)

我已根据评论中的建议更新了代码,现在可以使用了。

  1. 我已将int *更改为mwIndex *。

  2. 我复制了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