win32 和 win64 之间的哪些差异可能会导致执行 mex 文件时出错?

问题描述 投票:0回答:1

我正在尝试在我的计算机上运行field II提供的示例。此示例包含 matlab 函数以及 mex32 文件。我有更高版本的 matlab,所以我采用初始 .c 文件并将其转换为 mex64。然而,尽管像提供的示例中那样设置了所有内容,但我的 mex 函数不起作用。我对 C 编程不太熟悉,所以我不确定主要函数中到底哪里出现问题。如果有人可以指导我这个 .c 程序出了什么问题。另外,我可以成功地将这个 C 代码转换为 matlab 函数而不是使用 mex 文件吗?或者 C 代码中是否存在一些无法在 MATLAB 翻译中完全捕获的细微差别?

Matlab error 完整的原始C代码

我试图根据 C 程序的算法编写 matlab 函数,但我不确定索引是否正确。我知道matlab索引从1开始而不是0。我不明白的是这个env_pointer被设置为一个变量的地址,然后被调用,就像它包含N_samples+1个变量一样。

void make_interpolation (unsigned char  *envelope_data,   /*  The envelope detected and log-compressed data */
                 int            N_samples,        /*  Number of samples in one envelope line        */
             
                 int            *index_samp_line, /*  Index for the data sample number              */
                 int            *image_index,     /*  Index for the image matrix                    */
                         float          *weight_coef,     /*  The weight table                              */
                         int            N_values,         /*  Number of values to calculate in the image      */
             
                         unsigned char *image)            /*  The resulting image                           */

{int           i;                 /*  Integer loop counter                */
 int           ij_index_coef;     /*  Index into coefficient array        */
 unsigned char *env_pointer;      /*  Pointer to the envelope data        */
 float         *weight_pointer;   /*  Pointer to the weight coefficients  */
 
  ij_index_coef = 0;
  for (i=0; i<N_values; i++)
    {
     weight_pointer = &(weight_coef[ij_index_coef]);
     env_pointer = &(envelope_data[index_samp_line[i]]);
     image[image_index[i]] 
              =         weight_pointer[0] * env_pointer[0]
                      + weight_pointer[1] * env_pointer[1]
                      + weight_pointer[2] * env_pointer[N_samples]
                      + weight_pointer[3] * env_pointer[N_samples+1] + 0.5;
     ij_index_coef = ij_index_coef + 4;
    }
}

c matlab mex
1个回答
0
投票

乍一看,这是一个明显的问题:维度数组需要是 API 调用的正确整数大小,因此您需要更改此设置:

 int dimension[2];  

到此

 mwSize dimension[2];   

此外,您可能会收到有关此转换的警告:

(unsigned char *) mxGetPr(etc)

所以我会把它改成这样:

(unsigned char *) mxGetData(etc)
© www.soinside.com 2019 - 2024. All rights reserved.