2013-04-08 50 views
1

我是一位经验丰富的MATLAB用户,但对C和MEX文件全新。我有一个用C语言编写的复杂程序,需要在MATLAB中调用。该程序由一个文件夹中的几十个文件组成,其中一个名为main.c,它处理来自命令行的输入,并将结果传递给执行实际计算的其他类。为C程序创建一个MATLAB MEX文件

通常,要从命令行安装此程序,我将在UNIX命令提示符下运行./configure,make。然后,运行该程序./runMyProgram -f input_file.txt -p some_parameters。该程序将一个由数字列表组成的文本文件作为输入,并在命令窗口中打印结果表。我想为程序提供一个MATLAB数组(而不是一个.txt文件)并获取一个数组(而不是打印的结果表)。

我已经阅读了The Mathworks(我发现它非常不透明)的MEX文档以及一些其他的“教程”,但我完全失去了 - 这些例子适用于非常简单的单文件C程序,真的不讨论如何处理更大更复杂的程序。用一个MEX文件替换main.c文件就足够了,这个文件可以做同样的事情吗?另外,如何在MATLAB中编译整个软件包?

我会很感激任何关于从哪里开始的简明英语建议,或者指向任何以易于理解的方式处理主题的教程。

+0

看这里:http://www.shawnlankton.com/2008/03/getting-started-with-mex-a-short-tutorial/。当我刚开始时,这对我非常有帮助。 – Justin 2013-04-08 15:29:13

+1

构建复杂的MEX文件是一种痛苦。不要指望它是一个美丽的体验。 :) – Memming 2013-04-08 18:17:46

+0

为什么不使用'system'或类似的函数从MATLAB运行程序,然后解析输出?这样,您不必编写任何C代码或混淆该程序的代码(如果程序被作者更新,则不必再次执行)。 – wakjah 2013-04-09 10:51:31

回答

2

是的。通常用MEX文件替换main.c文件是这个过程。在你的情况下,因为你已经有了复杂的构建设置,建立一个库,然后建立一个单独的mex文件可能会更容易,这个文件只是链接到这个库。这比使用mex命令构建整个事情要容易得多。如果您导出需要从库中调用的函数,则可以从mexFunction调用它。 mexFunction可以完成所有mxArrays的创建和读取。一个简单的示例mexFunction可以,

#include "mex.h" 
// Include headers for your library 

void 
mexFunction(int nlhs,mxArray *plhs[],int nrhs,const mxArray *prhs[]) 
{ 
    void* x = mxGetData(prhs[0]); // Assume one input. Check nrhs 
    plhs[0] = mxCreateDoubleMatrix(10,10,mxREAL); // Create 10x10 double matrix for output 
    void* y = mxGetData(plhs[0]); 
    yourLibraryFunction(x, y); // Read from x and write to y. Pass sizes in if needed 
}