|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
下面是C的程序,在matlab里面调用的时候,也不报错,就是直接闪退,我查了网上说可能是数组溢出了,断点调试了,但是也没找到是哪有问题
- #include "mex.h"
- #include "math.h"
- void Recon(double *dims, double *m, double *Pro, double *P)
- {
- int i, j, k;
- int u, v ;
- double pu, pv, lamda, x, y, z, dx, dy, dz;
- double inter_x, inter_y ,sin_w,cos_w ,s;
- double Nx, Ny, Nz, nu , nv ,light_to_center;
- Nx = dims[0];
- Ny = dims[1];
- Nz = dims[2];
- dx = dims[3];
- dy = dims[4];
- dz = dims[5];
- nu = dims[6];
- nv = dims[7];
- sin_w = dims[8];
- cos_w = dims[9];
- light_to_center = dims[10];
-
- for (k = 1; k < Nz+1; k++)
- {
- for (i = 1; i < Nx+1; i++)
- {
- for (j = 1; j < Ny+1; j++)
- {
- x = (i-0.5)*dx - dx*(Nx / 2 + 0.5);
- y = (j-0.5)*dy - dy*(Ny / 2 + 0.5);
- z = (k-0.5)*dz - dz*(Nz / 2 + 0.5);
-
- //加权参数
- //s = - x * sin(deg2rad(beta)) + y * cos(deg2rad(beta));
- s = -x * sin_w + y * cos_w;
- pu = m[0] * x + m[1] * y + m[2] * z + m[3];
- pv = m[4] * x + m[5] * y + m[6] * z + m[7];
- lamda = m[8] * x + m[9] * y + m[10] * z +1;
-
- inter_x = pu /lamda ;
- inter_y = pv /lamda ;
-
- u = int(inter_x); // exchange u,v
- v = int(inter_y);
-
- if ((inter_x >= 1 && inter_x <= (nu-1 )) && (inter_y >= 1 && inter_y <= (nv-1)))
- {
- //在投影图中插值获得当前点的像素
- P[int(j-1 + Ny*((i-1) + Nx*(k-1)))] = Pro[int( inter_x - 1 + nv* (inter_y - 1))] * (light_to_center * light_to_center)/ ((light_to_center - s )* (light_to_center - s ));
- }
- else
- {
- P[int(j-1 + Ny*((i-1) + Nx*(k-1)))] = 0;
- }
- // if ((u >= 1 && u <= (Ni-1 )) && (v >= 1 && v <= (Nj-1)))
- // {
- // P[u - 1 + Nj* (v - 1)] = P[u - 1 + Nj* (v - 1)] + invoxel[j-1 + Ny*((i-1) + Nx*(k-1))] * (u - inter_x + 1)*(v - inter_y + 1);
- // P[u - 1 + Nj* v] = P[u - 1 + Nj* v] + invoxel[j-1 + Ny*((i-1) + Nx*(k-1))] * (u - inter_x + 1)*(inter_y - v);
- // P[u + Nj* (v - 1)] = P[u + Nj* (v - 1)] + invoxel[j-1 + Ny*((i-1) + Nx*(k-1))] * (inter_x - u)*(v - inter_y + 1);
- // P[u + Nj* v] = P[u + Nj* v] + invoxel[j-1 + Ny*((i-1) + Nx*(k-1))] * (inter_x - u)*(inter_y - v);
- // }
- }
- }
- }
- }
- //接口
- //nlhs 为输出参数的数目,
- //plhs是输出参数数组,指针数组
- //nrhs是为输入参数的数目
- //prhs是输入参数数组吗,是一个指针数组
- void mexFunction(int nlhs, mxArray *plhs[],int nrhs, const mxArray *prhs[])
- {
- double *dims;
- double *m, *Pro;
- double *P;
- if (nrhs != 3)
- mexErrMsgTxt("3 inputs required.");
- if (nlhs != 1)
- mexErrMsgTxt("One output required.");
- dims = mxGetPr(prhs[0]);
- m = mxGetPr(prhs[1]);
- Pro = mxGetPr(prhs[2]);
- /* set the output pointer to the output matrix */
- // plhs[0] = mxCreateDoubleMatrix(dims[3],dims[4], mxREAL);
- const mwSize ds[3] = {*dims,*(dims +1),*(dims +2)};
- plhs[0] = mxCreateNumericArray(3,ds,mxSINGLE_CLASS,mxREAL);
- /* create a C pointer to a copy of the output matrix */
- P = mxGetPr(plhs[0]); //获得矩阵第一个元素的指针
- /* call the C subroutine */
- Recon(dims, m, Pro, P);
- }
- //plhs:指向输出参数的指针
- //nrhs:输入参数数目
复制代码 |
|