1. 程式人生 > >C#呼叫Matlab函式詳細步驟

C#呼叫Matlab函式詳細步驟

  在剛接觸到這一模組的時候根據網上的步驟進行操作發現莫名的報錯,經過了很長時間的查詢修改才找到問題,在此記錄一下c#呼叫Matlab的過程。

     1.首先配置環境。

Matlab Runtime (MCR)一定要和你的C#專案平臺一致。

c#專案平臺如下圖,可以點選箭頭→配置管理器→活動解決方案平臺→新建→選擇需要的專案平臺。

                                 

而Matlab Runtime的配置可以在系統的環境變數中查詢,具體步驟:我的電腦右鍵屬性→高階系統設定→環境變數→Path

                        

如果沒有這個東西,可以直接上Matlab網站下載

https://ww2.mathworks.cn/products/compiler/matlab-runtime.html。注意在Matlab 2016及以上的版本已經沒有x86。並且在上方的箭頭matlab\R2017b\bin\win64也需要與Runtime的操作平臺保持一致,若不一致後期建立物件時會報錯。

     2.配置完成之後可以生成dll檔案了。

拿Matlab自帶函式Linqprog(線性規劃的函式)舉例,首先新建函式,輸入如下函式,並儲存。

其次在matlab命令列中輸入deploytool,跳出如下頁面     

                                   

  

選擇Library Compiler 進入如下頁面。

第一個箭頭選擇.net 環境,第二個箭頭新增你剛才儲存的函式。後面其他的配置不需要更改,如果想要對生成的dll檔案裡面的類名以及名稱空間進行修改可以在此圖片最後一部分進行修改,此處就不修改。點選右上角Package,儲存並等待。此處如果生成失敗,說明matlab安裝存在問題,自己在網上找資源,或者可以留言找我要資源(免費喲)。這裡生成dll檔案就已經完成了,就剩下最後一步編寫C#程式了。

     3.編寫C#檔案

首先建立專案,並匯入兩個依賴項,(1)剛才Package生成的dll檔案(MyLinprog.dll)。(2)MWArray.dll檔案,在Matlab安裝目錄下%matlabroot%\\toolbox\dotnetbuilder\bin\win64\v4.0\MWArray.dll。匯入依賴項成功之後編寫函式。

//匯入兩個名稱空間
//using MathWorks.MATLAB.NET.Arrays; 
//using MyLinprog; 
static void Main(string[] args)
        {
            //輸入引數
            MWArray A = (MWNumericArray)new double[,] { { 1, -1, 1 }, { 3, 2, 4 }, { 3, 2, 0 } };
            MWArray f = (MWNumericArray)new double[] { -5, -4, -6 };
            MWArray b = (MWNumericArray)new double[] { 20, 42, 30 };
            MWArray lb = (MWNumericArray)new double[] { 0, 0, 0 };
            MWArray ub = (MWNumericArray)new double[] { };
            MWArray Aeq = (MWNumericArray)new int[3] {0,0,0};
            MWArray beq = (MWNumericArray)new int[1] {0};
            MWArray x0 = (MWNumericArray)new int[0] ;
            
            MWArray[] agrsIn = new MWArray[] { (MWNumericArray)f, (MWNumericArray)A, (MWNumericArray)b, (MWNumericArray)lb, (MWNumericArray)ub, };//輸入引數陣列
            MWArray[] agrsOut = new MWArray[2]; //輸出存放的陣列

            MyLinprog.Class1 mu = new MyLinprog.Class1(); //例項化物件
            mu.MyLinprog(2, ref agrsOut, agrsIn); //計算
            Console.WriteLine("x最優值為 : \t");
            Console.WriteLine(agrsOut[0]);
            Console.WriteLine("得到的y值為 : \t" + agrsOut[1]);
            Console.ReadKey();

        }

     4.此時已經完成了所有工作,接下來總結在這個過程中常出現的問題。

問題①

在呼叫MWArray類時出現問題,此時應注意你所用的MWArray的環境需要和你的專案平臺保持一致。即,引用的win64下的MWArray時,c#的專案平臺應該是x64。

問題②

在例項化物件處報錯(因為我的環境配置好的,修改環境需要重啟電腦,所以就沒有去把錯誤調處來)。報錯依然是型別初始化異常。

此時就應該檢視MCR(Matlab Runtime)與專案平臺以及MATLAB\R2017b\bin\win64三者是否保持一致。