C ++和Matlab的组合

时间:2013-11-20 16:53:15

标签: c++ matlab

我正在编写一些微分方程的模拟。我的想法如下:

1. Write the core simulation (moving forward in time, takes a lot of time) in C++
2. Do initialisation and the analysis of the results with a program
   like Matlab/Scilab

(1)的原因是如果正确实现C ++会更快。

(2)的原因在于,对于我来说,使用像Matlab这样的程序进行分析更容易,例如绘图等。

是否可以这样做,如何从Matlab调用C ++? 或者你有一些建议以不同的方式做到这一点吗?

3 个答案:

答案 0 :(得分:4)

你当然可以按照你的建议去做。但我建议您首先在Matlab中开发整个解决方案,然后,如果它的性能真正地保留了您的工作,请考虑将关键元素转换为C ++。这将优化您的时间使用,可能以您的计算机时间为代价。但是,当你把它鞭死时,计算机就是一头没有人道社会干预的现代驴。

如你所知,编写好的C ++可能比解释Matlab更快。但问问自己 Matlab是用什么编写的?对于大部分计算密集型核心功能,Matlab调用用C ++(或其他)编写的库。你的任务不是编写代码比解释Matlab更快,而是比安装软件巨大市场所敦促的专家编写的C ++(或其他)更快。

答案 1 :(得分:3)

是的,Matlab有一个C / C ++ API

此API允许:

  • 编写可以从Matlab调用的C ++函数
  • .mat文件中读取/写入数据
  • 从C ++调用Matlab引擎

我正在尝试类似于你想做的事情,我的方法是:

  • 在C ++中导入.mat文件
  • 的输入数据
  • 运行模拟
  • 将结果导出回.mat文件

Matlab API在C中,我建议你为方便起见编写一个C ++包装器。

为了使用Matlab mxArray,我建议您查看boost::multi_array库。

特别是你可以像这样从Matlab multi_array_ref初始化mxArray类型的对象:

boost::multi_array_ref<double,2> vec ( mxGetPr (p), boost::extents[10][10], boost::fortran_storage_order() );

这种方法使代码更具可读性。

答案 2 :(得分:1)

您可以从MATLAB命令行调用自己的C,C ++或Fortran子例程,就好像它们是内置函数一样。这些程序称为二进制MEX文件,是MATLAB解释器加载和执行的动态链接子程序。 你应该设置编译器,看看Setting up mex to use the Visual Studio 2010 compiler。 所有关于MEX文件的信息都在这里:http://www.mathworks.com/help/matlab/matlab_external/using-mex-files-to-call-c-c-and-fortran-programs.html