从.net同时调用两个Matlab函数

时间:2010-04-11 20:50:13

标签: c# .net matlab concurrency

我正在编写一个C#应用程序,我想同时调用不同的matlab函数(来自不同的线程)。每个Matlab函数都位于自己编译的.net库中。看来我一次只能调用一个Matlab函数。

即,如果从thread1调用matlab_func1(),则从thread2调用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);
  }

3 个答案:

答案 0 :(得分:7)

我建议当你调用你的函数时,会产生MATLAB(或嵌入到DLL中的MATLAB的实时研讨会)并运行该函数。 C#和C之间的MATLAB接口可能有一些全局外部变量,因此MATLAB可能无法在同一进程中生成两次。此外,MATLAB本身在很多方面都是单线程的。他们正致力于更多地使用多核。

之前我使用过Java / Matlab接口,并在this site上阅读以下内容: Matlab是单线程的。这意味着如果您尝试从直接从Matlab函数调用的Java函数中进行eval或feval,它将等待第一个matlab函数终止。

我可能建议的测试是将“DoKalmanFilter”和“DoImageProcessing”放入单独的程序集或应用程序中,然后创建一个生成两个新的单独应用程序的应用程序。这样你就可以得到两个进程,MATLAB将在每个进程内运行一次,使你能够同时运行你的函数。

如果有效,你可以开始考虑解决这个问题。您不希望必须一直生成应用程序并将其关闭。您可能需要在流程之间使用一些进程间通信来传递数据,这可能会变得丑陋: - )

答案 1 :(得分:2)

根据Mathworks documentation

A single application only has access to a single MCR computational engine.

因此,正如Fuzz所述,您需要创建第二个应用程序,或至少第二个进程,而不是第二个进程。但是,您可以将代码保留在一个程序集中 - 从第二个进程调用相同的程序集会为其提供自己的资源。

另一种方法是使用MATLAB的并行处理工具箱将每个函数调用分成几个核心,使每次运行更快,并按顺序调用它们。但是,这取决于您的MATLAB函数是否适合并行化。

答案 2 :(得分:-2)

云计算一路兄弟。你只需将吸盘指向云端,让像亚马逊这样的提供商处理它​​。

确保将数据封送到云端和从云端进行封送会产生开销,但这绝不会与matlab中每次交易的实际工作时间相冲突。

这是一个非常低成本的解决方案,可以更好地进行经济扩展(我说这假设你没有停在世界级的服务器场上),而不是内部工作。

这是让我感动的东西: http://www.mathworks.com/programs/techkits/ec2_paper.html

云是事实。