同时从.NET中调用两个Matlab函数

4
我正在编写一个C#应用程序,想要同时从不同的线程调用不同的Matlab函数。每个Matlab函数都位于自己编译的.NET库中。然而,目前似乎只能一次调用一个Matlab函数。
例如,如果从线程1调用matlab_func1(),然后从线程2调用matlab_func2(),则matlab_func2()必须等待matlab_func1()执行完成。
是否有办法同时调用不同的Matlab函数?谢谢。
 MWArray[] DoKalmanFilter(double vel_x, double vel_y, double vel_z, double cal_x, double cal_y, double cal_z, bool doCal)
  {
     ...set up parameters       

     ret = KalmanFilter.kalman_actual(6, velx, vely, velz, cal_x, cal_y, cal_z, 
     return ret;
  }

  private void DoImageProcessing()
  {
       ..set up parameters
      MWArray[] ret = _imgProcessor.DoImageProcessing(2, rgbMarkerColor, hsvThreshold, angleDiffThreshold);
  }

请问您能否发布一下您用于线程化Matlab调用的代码? - Byron Sommardahl
我是说,这些方法是从不同的线程调用的。你具体想要看什么? - Mav3rick
3个回答

7
我建议在调用函数时,MATLAB(或嵌入到DLL中的MATLAB实时工作室)会被生成并运行该函数。C#和C之间的MATLAB接口可能有一些全局外部变量,因此MATLAB可能无法在同一进程中生成两次。此外,MATLAB本身在很多方面都是单线程的。他们正在努力向更多使用多核心发展。
我以前使用过Java/Matlab接口,并在这个网站上读到了以下内容: MATLAB是单线程的。这意味着如果您尝试从直接从MATLAB函数调用的Java函数中进行eval或feval操作,它将挂起等待第一个MATLAB函数终止。
我的建议是将“DoKalmanFilter”和“DoImageProcessing”放入不同的程序集或应用程序中,然后创建一个应用程序来生成您的两个新的分离应用程序。这样,您将获得两个进程,并且MATLAB将在每个进程中运行一次,使您能够同时运行函数。
如果这有效,那么您可以开始考虑解决这个问题的方法。您不希望一直生成和关闭应用程序。您可能需要在进程之间使用一些进程间通信来传递数据,这可能会变得很麻烦 :-)

2
根据Mathworks文档
A single application only has access to a single MCR computational engine.

因此,正如Fuzz所说,您需要创建第二个应用程序或至少第二个进程,而不是第二个线程。但是,您可以将代码留在一个程序集中 - 从第二个进程调用相同的程序集会为其提供自己的资源。
另一种选择是使用MATLAB的并行处理工具箱将每个函数调用分割成几个核心,使每个运行更快,并按顺序调用它们。但是,这取决于您的MATLAB函数是否适合并行化。

-2

云计算是王道。你只需要将它指向云端,让像亚马逊这样的提供商来处理它。

当然,在数据从云端传输到本地的过程中会有一些开销,但这永远无法与每个事务在Matlab中实际执行的时间相竞争。

这是一种非常低成本的解决方案,比你自己内部实现更具经济性(我是这么说的,假设你没有停留在世界一流的服务器农场)。

这里有一些让我感到兴奋的东西: http://www.mathworks.com/programs/techkits/ec2_paper.html

云就是真理。


我给你点了踩,因为虽然你的回答可能会有用,但它并不适合在这里发表。 - Noon Silk

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接