运行此C++-Mex文件几次后,Matlab崩溃
我试图加快我的一些方法的速度,但不明白为什么我的两个方法计算正确,但却多次失败 设置: 我在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]的矩阵运行此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,我得到的是单个向量或几个向量的正确结果。如果我使用
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);
}
}
}
}