我正在尝试加快我的一些方法并且无法弄清楚,为什么我的两个方法计算正确但无法多次运行。
设置:
我在p
和v
中得到一组(可能是巨大的)向量(列),为简单起见,我们假设只是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只是冻结或崩溃,我无法弄清楚原因。你能确认崩溃并帮我解决吗?那将是真棒。