使用Armadillo插值输出不一致的MEX文件

时间:2017-11-14 23:15:16

标签: c++ matlab interpolation mex armadillo

我正在尝试将matlab代码转换为c ++ mex文件,以便更有效地运行一些计算。我正在使用带有blas和lapack的armadillo库进行一些矩阵运算,这涉及插值数据以应用延迟。

但是,我收到的mex文件输出不一致。如果我使用相同的输入运行相同的mex文件,有时我会收到正确的输出,偶尔它会输出一个巨大的数字(即不是大约100,它大约是10 ^ 246)。

我对c ++编码很新,并且已经耗尽了我的常识知识库。我相信问题出在我的插值步骤中,因为我能够始终如一地输出正确的延迟矩阵,这是前面的步骤。

有没有人知道我在做什么来产生这个?

在Matlab中我打电话:

mex  test.cpp  -lblas -llapack 
[outData] = test( squeeze(inData(:,:,ang,:)) , params, angles(ang),1);

我的mex文件通常是:

  #include <math.h>
    #include <mex.h>
    #include <armadillo>
    #include "armaMex.hpp"
    using namespace std; //avoid having to scope with std:: before commands
    using namespace arma; //avoid having to scope with std:: before commands
    void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]){


    // ============== INITIALIZE =============

    // Initialize Data
    const mwSize *dims;
    int cDim,dDim,aDim,numDims;         // Dimension variables
    int m, n, a;                                                           // Loop variables
    mxArray *fs_p, *f0_p, *prf_p, *pval_p, *c_p;      // Parameter pointers
    const double *fs,*f0,*prf,*pval, *c, *ang;           // Parameter variables
    const int  *nthreads;

    // Initialize pointers for param variables
    pval_p = mxGetField(prhs[1],0,"pval"); //note that your parameters need these exact names
    fs_p = mxGetField(prhs[1],0,"fs");
    f0_p = mxGetField(prhs[1],0,"f0");
    prf_p = mxGetField(prhs[1],0,"prf");
    c_p = mxGetField(prhs[1],0,"c");

    // Initialize parameters
    pval = mxGetPr(pval_p);
    fs = mxGetPr(fs_p);
    f0 = mxGetPr(pval_p);
    prf = mxGetPr(prf_p);
    c = mxGetPr(c_p);
    ang = (double*)mxGetData(prhs[2]);
    nthreads = (int*)mxGetData(prhs[3]);

    dims = mxGetDimensions(prhs[0]);
    numDims = (int)mxGetNumberOfDimensions(prhs[0]);
    dDim=(int)dims[0];cDim=(int)dims[1];aDim=(int)dims[2];

    //Read in channel Data
    cube data_in = armaGetCubePr(prhs[0]);

    (....... simple calculations that look okay ... )

    cube data_out(dDim, bDim, aDim);
    cube delayedData(dDim, aDim, bDim);

    vec delayArray(dDim);           //need to define these tmp variables bc subcube fcn otherwise gives me errors idk
    vec tmpIN(dDim);
    vec tmpOut(dDim);
    vec tmpOUTdata(dDim);


    for(m=0;m<bDim;m++){
        for(n=0;n<cDim;n++){
            for (a=0;a<aDim;a++){

            delayArray = tdelays.subcube(0,n,m,dDim-1,n,m);
            tmpIN = data_in.subcube(0,n,a,dDim-1,n,a);
            tmpOUTdata = data_out.subcube(0,m,a,dDim-1,m,a);

           interp1(timeArray, tmpIN , delayArray, tmpOut, "linear",0);

           data_out.subcube(0,m,a,dDim-1,m,a) =  tmpOUTdata +tmpOut;
            }
        }
    }


    // Define output data
    plhs[0] = armaCreateMxMatrix(data_out.n_rows, data_out.n_cols, data_out.n_slices);
    armaSetCubePr(plhs[0], data_out);

    return
    }

0 个答案:

没有答案