编写 Mex 文件时出现错误消息,函数的数组输出有问题吗?

Posted

技术标签:

【中文标题】编写 Mex 文件时出现错误消息,函数的数组输出有问题吗?【英文标题】:error messages when writing Mex files, problem with array output from functions? 【发布时间】:2011-07-11 06:55:37 【问题描述】:

我更像是一个 Matlab 程序员,而且好几年没用过 C 了!现在我必须用 C 编写一些代码,并通过 mexFunction 命令从 Matlab 调用它。到现在为止还挺好。但是我的代码需要许多函数调用,其中参数和返回值都是数组。为此,我使用指针返回。但是我遇到了大约一百万个困难,一旦修复了另一个,就会创建另一个。

排序代码示例如下(实际代码海量)

#include "mex.h"
#include "math.h"

int Slength=95;


double innercfunction(double q,double y)

  int i;
  double X;

  X=q*y;



double *c1function(double q,double Sim[])

  double *F12=malloc(Slength);
  int i;
  double vdummy,qdummy;
  qdummy=q;

  for(i=0;i<Slength;i++)
  
    vdummy=Sim[i];
    F12[i]=innercfunction(qdummy,vdummy);
  
  return F12;



void mexFunction(int nlhs, mxArray *prhs[],int nrhs,const mxArray *plhs[])

  double *q=mxGetPr(prhs[0]);
  double *Sim=mxGetPr(prhs[1]);

  double *SS=c1function(q,Sim);

我将它保存为 help_file.c 并从 MATLAB 工作区编译为:

mex -g help_file.c

我得到以下错误:

help_file.c: In function ‘mexFunction’:
help_file.c:38: error: incompatible type for argument 1 of ‘c1function’
help_file.c:17: note: expected ‘double’ but argument is of type ‘double *’

我最初尝试传递 Sim[i] 而不是 vdummy,但这不起作用,这就是我首先定义虚拟变量的原因。

我想这是一个微不足道的问题,但我仍然会感谢人们对此的帮助。

【问题讨论】:

【参考方案1】:

clfunction 的原型要求你传递一个双精度标量作为第一个参数;您正在传递一个指向双精度 q 的指针,因此会出现编译器错误。您是否期望 prhs[0] 包含标量?如果是这样,您可以使用q[0] 来提取值;否则,您可以使用 mxGetScalar(prhs[0]) 返回一个标量双精度 (http://www.mathworks.com/help/techdoc/apiref/mxgetscalar.html)。

但是,我不确定修复该问题是否会使您的 mex 文件按预期工作。我建议花一些时间在这里阅读 mex 示例:http://www.mathworks.com/support/tech-notes/1600/1605.html

特别是,您当前的 mex 文件不会产生任何输出参数,因为您没有分配给左侧 plhs

【讨论】:

以上是关于编写 Mex 文件时出现错误消息,函数的数组输出有问题吗?的主要内容,如果未能解决你的问题,请参考以下文章

使用 MATLAB mex 将向量与另一个向量分配时出现分段错误

mex 编译时出现 GCC 版本警告

scanf 调用时出现“无法打开输出文件”错误

添加 6 条数组消息时出现 Protobuf 内存错误

在 vl-feat 中运行 vl_compile 时出现 Mex 错误

无效的 mex 文件错误(libstd++ 版本)