几次运行此C ++ - Mex文件后,Matlab崩溃了

时间:2015-04-11 20:20:00

标签: c++ matlab mex eigen

我正在尝试加快我的一些方法并且无法弄清楚,为什么我的两个方法计算正确但无法多次运行。

设置: 我在pv中得到一组(可能是巨大的)向量(列),为简单起见,我们假设只是3D单位向量。对于每对列,我想计算相应的q = p*cos(||v||) + v/||v|| * sin(||v||)。为方便起见(以及我的大型示例),我想使用Eigen及其MatrixXd类。

#include "mex.h"
#include "math.h"
#include <stdlib.h>
#include <Eigen/Dense>
using namespace std;
using namespace Eigen;

void mexFunction( int nlhs, mxArray *plhs[],
                  int nrhs, const mxArray *prhs[])   {
    const mxArray *IpA, *IvA; //Just names
    double *Ip, *Iv, *Oq;
    mwSize i,j;
    size_t ItemSize,N;
    // Inputs
    IpA = prhs[0];
    IvA = prhs[1];
    Ip = mxGetPr(IpA); // Base Points
    Iv = mxGetPr(IvA); // Directions

    ItemSize = mxGetM(IpA);
    N = mxGetN(IpA);
    if ( (ItemSize != mxGetM(IvA)) || (N != mxGetN(IvA)) )
        mexErrMsgTxt("p and v have to be of same size.");

    plhs[0] = mxCreateDoubleMatrix((mwSize)ItemSize,(mwSize)N,mxREAL);
    Oq = mxGetPr(plhs[0]);
    // Norm directional vectors V
    MatrixXd normV(ItemSize,1);
    for (i=0; i<N; i++) {
        normV(i) = 0;
        for (j=0; j<ItemSize; j++) {
            normV(i) += Iv[j + ItemSize*i]*Iv[j + ItemSize*i];
        }
    }
    //Compute result
    normV = normV.array().sqrt();
    for (i=0; i<N; i++) {
        for (j=0; j<ItemSize; j++) {
            if (normV(i)==0)
                Oq[j + ItemSize*i] = 0;
            else {
                Oq[j + ItemSize*i] = Ip[j + ItemSize*i]*cos(normV(i)) + Iv[j + ItemSize*i]*sin(normV(i))/normV(i);
            }
        }
    }
}

我跟随Pascal Getreuer the tutorial

问题:然而,如果我正在调用这个已编译的函数(让我们将它命名为SnExp我得到了单个向量或一些向量的正确结果如果我使用大数字(3x8000不是那么大)或多次调用函数(让我们取SnExp(repmat([1;0;0],1,1000),repmat([1;0;0],1,1000)),它应该返回一个包含1000列的矩阵{{ 1}}。

Matlab只是冻结或崩溃,我无法弄清楚原因。你能确认崩溃并帮我解决吗?那将是真棒。

0 个答案:

没有答案