鱼C论坛

 找回密码
 立即注册
查看: 2014|回复: 0

(有偿)有人做过matlab c混编吗,matlab调用c程序,c传出三维矩阵

[复制链接]
发表于 2021-4-23 14:05:56 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
下面是C的程序,在matlab里面调用的时候,也不报错,就是直接闪退,我查了网上说可能是数组溢出了,断点调试了,但是也没找到是哪有问题

  1. #include "mex.h"
  2. #include "math.h"
  3. void Recon(double *dims, double *m, double *Pro, double *P)
  4. {
  5.         int i, j, k;
  6.         int u, v  ;
  7.         double pu, pv, lamda, x, y, z, dx, dy, dz;
  8.         double inter_x, inter_y ,sin_w,cos_w ,s;
  9.         double Nx, Ny, Nz, nu , nv ,light_to_center;

  10.         Nx = dims[0];
  11.         Ny = dims[1];
  12.         Nz = dims[2];
  13.         dx = dims[3];
  14.         dy = dims[4];
  15.         dz = dims[5];
  16.         nu = dims[6];
  17.         nv = dims[7];
  18.     sin_w = dims[8];
  19.     cos_w = dims[9];
  20.     light_to_center = dims[10];
  21.    
  22.         for (k = 1; k < Nz+1; k++)
  23.         {
  24.                 for (i = 1; i < Nx+1; i++)
  25.                 {                       
  26.                         for (j = 1; j < Ny+1; j++)
  27.                         {
  28.                                 x = (i-0.5)*dx - dx*(Nx / 2 + 0.5);                       
  29.                                 y = (j-0.5)*dy - dy*(Ny / 2 + 0.5);
  30.                                 z = (k-0.5)*dz - dz*(Nz / 2 + 0.5);
  31.                                
  32.                                 //加权参数
  33.                                 //s = - x * sin(deg2rad(beta)) + y * cos(deg2rad(beta));
  34.                 s = -x * sin_w + y * cos_w;
  35.                                 pu = m[0] * x + m[1] * y + m[2] * z + m[3];
  36.                                 pv = m[4] * x + m[5] * y + m[6] * z + m[7];
  37.                                 lamda = m[8] * x + m[9] * y + m[10] * z +1;
  38.                                
  39.                                 inter_x = pu /lamda ;
  40.                                 inter_y = pv /lamda ;
  41.                                
  42.                                 u = int(inter_x); // exchange u,v
  43.                                 v = int(inter_y);
  44.                                
  45.                                 if ((inter_x >= 1 && inter_x <= (nu-1 )) && (inter_y >= 1 && inter_y <= (nv-1)))
  46.                                 {
  47.                                         //在投影图中插值获得当前点的像素
  48.                                         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 ));                                       
  49.                                 }
  50.                                 else
  51.                                 {
  52.                                          P[int(j-1 + Ny*((i-1) + Nx*(k-1)))]  = 0;
  53.                                 }

  54. //                                if ((u >= 1 && u <= (Ni-1 )) && (v >= 1 && v <= (Nj-1)))
  55. //                                {
  56. //                                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);
  57. //                                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);
  58. //                                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);
  59. //                                P[u + Nj* v]           = P[u + Nj* v]           + invoxel[j-1 + Ny*((i-1) + Nx*(k-1))] * (inter_x - u)*(inter_y - v);
  60. //                                }
  61.                         }
  62.                 }
  63.         }

  64. }


  65. //接口
  66. //nlhs 为输出参数的数目,
  67. //plhs是输出参数数组,指针数组
  68. //nrhs是为输入参数的数目
  69. //prhs是输入参数数组吗,是一个指针数组
  70. void mexFunction(int nlhs, mxArray *plhs[],int nrhs, const mxArray *prhs[])
  71. {
  72.         double *dims;
  73.         double *m, *Pro;
  74.         double *P;
  75.         if (nrhs != 3)
  76.                 mexErrMsgTxt("3 inputs required.");
  77.         if (nlhs != 1)
  78.                 mexErrMsgTxt("One output required.");

  79.         dims = mxGetPr(prhs[0]);
  80.         m = mxGetPr(prhs[1]);
  81.         Pro = mxGetPr(prhs[2]);

  82.         /*  set the output pointer to the output matrix */
  83. //         plhs[0] = mxCreateDoubleMatrix(dims[3],dims[4], mxREAL);

  84.     const mwSize ds[3] = {*dims,*(dims +1),*(dims +2)};
  85.     plhs[0] = mxCreateNumericArray(3,ds,mxSINGLE_CLASS,mxREAL);
  86.         /*  create a C pointer to a copy of the output matrix */
  87.         P = mxGetPr(plhs[0]);   //获得矩阵第一个元素的指针
  88.         /*  call the C subroutine */
  89.         Recon(dims, m, Pro, P);
  90. }

  91. //plhs:指向输出参数的指针
  92. //nrhs:输入参数数目
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-19 15:23

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表