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

运行此C++-Mex文件几次后,Matlab崩溃,c++,matlab,mex,eigen,C++,Matlab,Mex,Eigen,我试图加快我的一些方法的速度,但不明白为什么我的两个方法计算正确,但却多次失败 设置: 我在p和v中得到了一组可能很大的向量列,为了简单起见,我们假设只有3D单位向量。对于每对列,我想计算相应的q=p*cos | | v | |+v/| | v | | |*sin | | v |。为了方便起见和我更大的例子,我想使用Eigen和它的MatrixXd类 下面是帕斯卡·盖特勒 问题是:尽管如此,如果我调用这个编译后的函数,让我们把它命名为SnExp,我得到的是单个向量或几个向量的正确结果。如果我使用

我试图加快我的一些方法的速度,但不明白为什么我的两个方法计算正确,但却多次失败

设置: 我在p和v中得到了一组可能很大的向量列,为了简单起见,我们假设只有3D单位向量。对于每对列,我想计算相应的q=p*cos | | v | |+v/| | v | | |*sin | | v |。为了方便起见和我更大的例子,我想使用Eigen和它的MatrixXd类

下面是帕斯卡·盖特勒

问题是:尽管如此,如果我调用这个编译后的函数,让我们把它命名为SnExp,我得到的是单个向量或几个向量的正确结果。如果我使用的是一个不太大的3x8000大数字,或者调用了几次函数,那么让我们以SnExprepmat[1;0;0],11000,repmat[1;0;0],11000为例,它应该返回一个包含1000列[1.3818;0;0]的矩阵


Matlab只是冻结或崩溃,我不知道为什么。你能确认那次撞车并帮我修理一下吗?那太棒了

您应该选择调试代码。查看这些关于如何启用MEX代码调试的说明,这样您就可以自己一步一步地调试它,并确定它崩溃的位置和原因:感谢链接,您是对的;当你使用MATLAB调试器时,在C++中不容易看到问题。我查一下你的指示。顺便说一句,在这里运行Mac操作系统。完全理解。MATLAB调试器相当不错。调试MEX文件是一件痛苦的事,我很抱歉你不能在MATLAB中完成它。。。如果您在Mac OS中运行,则必须将调试源代码输出到XCode并在那里进行调试。这是唯一能让你知道发生了什么的方法。我发布的链接有一个Mac OS设置。祝你好运现在已经在运行调试器了,谢谢你的链接,这真的很有帮助。这些函数已经在Matlab中运行了,但是它们太慢了。这就是为什么我知道它的计算是正确的——我有一个参考实现:您似乎将normV声明为ItemSizex1的大小。但是在第一个for循环中,您似乎将它从0索引到N-1。对吗?
#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);
            }
        }
    }
}