鱼C论坛

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

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

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

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

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

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:输入参数数目
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-22 13:54

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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