2010-04-11 98 views
4

我正在編寫一個C#應用程序,我想同時調用不同的matlab函數(來自不同的線程)。每個Matlab函數都位於其自己編譯的.net庫中。看來,我只能一次調用一個Matlab函數。同時調用兩個Matlab函數.net

即,如果從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); 
    } 
+0

你可以請發表你正在使用的線程你的matlab調用? – 2010-04-11 20:55:53

+0

我的意思是......這些方法被從不同的線程調用。你有什麼特別感興趣的看到? – Mav3rick 2010-04-11 23:35:23

回答

7

我建議,當你打電話給你的函數,MATLAB(或MATLAB的是被嵌入到一個DLL實時車間)被啓動,並運行該功能。 C#和C之間的MATLAB接口可能有一些全局外部變量,因此在相同的過程中,MATLAB可能不會產生兩次。另外,MATLAB本身在很多方面都是單線程的。他們正在致力於更多地使用多核。

我已經使用過Java/Matlab接口,並且在this site上閱讀了以下內容: Matlab是單線程的。這意味着如果您嘗試從Java函數直接調用的Java函數中進行評估或調整,它將等待第一個matlab函數終止。

我可能會建議作爲一個測試,將「DoKalmanFilter」和「DoImageProcessing」放入單獨的程序集或應用程序中,然後生成一個應用程序,生成您的兩個新的獨立應用程序。這樣你就可以得到兩個進程,MATLAB將在每個進程中運行一次,讓你能夠同時運行你的函數。

如果有效,您可以開始思考如何解決這個問題。你不希望產生應用程序並一直關閉它們。您可能需要在流程之間使用一些進程間通信來傳遞數據,它可能會變得很難看:-)

-2

雲計算一路走來。你只需將這個傻瓜指向雲端,讓像亞馬遜這樣的供應商處理它。

當然,雲端數據封送會產生開銷,但這絕不會與matlab中的實際工作對每個事務所花費的時間產生競爭。

這是一個非常低成本的解決方案,它比您可以在內部做的更經濟地擴展(我假設您並非停在世界級的服務器場中)。

下面是我去的東西滾動: http://www.mathworks.com/programs/techkits/ec2_paper.html

雲就是這個道理。

+0

我低估了你,因爲雖然可以說是有用的,但你的答案在這裏並不合適。 – 2010-04-22 06:41:34

2

按照Mathworks documentation

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

因此,Fuzz說,你需要創建第二個應用程序,或者至少第二過程,而不是第二個線程。但是,您可以將代碼保留在一個程序集中 - 從第二個進程調用同一個程序集爲其提供自己的資源。

另一種方法是使用MATLAB的並行處理工具箱將每個函數調用拆分到多個內核中,使每個函數調用更快,並按順序調用它們。但是,這取決於您的MATLAB函數是否適合並行化。