本博客所有文章分類的總目錄:【總目錄】本博客博文總目錄-實時更新
Matlab和C#混合編程文章目錄 :【目錄】Matlab和C#混合編程文章目錄
Matlab與.NET的混合編程,掌握了基本過程,加上一定的開發經驗和算法基礎,肯定不難。反之,有時候一個小錯誤,可能抓破腦袋,加班幾個晚上,調試才能解決。同樣,由於Matlab.NET混編的特殊性,加上MathWorks的原因,英文文檔和沒有披露一些詳細的細節(甚至不允許反編譯MWArray.dll,呵呵,它不允許,不代表你不會哦)。經過很多項目,和大量的實驗,也發現了一些小技巧和小秘密,今天就分享其中一個,先做一個簡單的鋪墊,下一篇將寫一個實際例子。
1.Matlab.NET混編小技巧
常規混編時,比如我們要調用plot函數進行繪圖,肯定是先自己寫一個m函數,把plot封裝一下,根據自己的需要,傳遞數據和參數。實際上,對於Matlab的內置函數,是不需要這么做的。也就是說,對於Matlab的內置函數,是可以直接在C#中進行調用的,只要傳遞的參數符合要求,就可以得到結果。
2.什么是Matlab的內置函數
本文所說的Matlab內置函數,就是Matlab所謂的"built-in MATLAB function"。
在Matlab中,可以使用exist返回一個名稱或者函數的狀態,比如是工作區的變量,搜索路徑的m函數,dll文件或者內置函數。
比如,我們可以使用exist 來查看plot函數的信息:
1 >> exist plot 2 3 ans = 4 5 5
可以看到,值為5,返回5說明就是"built-in MATLAB function"。從Matlab的組成來看,這些built-in MATLAB function應該都是matlab的核心函數,因此,也應該都包含在MCR中,因此這是一個直接可以調用的理由吧。
3.Matlab有哪些內置函數
在發現上述小技巧之后,本人親自對其中幾個內置函數進行了測試,證明其是可以在C#中直接調用,然后,我就想,到底有Matlab有多少個內置函數,函數名稱有是什么?在把Matlab Help翻了很久之后,依舊沒有結果。只是猜測,可能太多了,Matlab也沒有特別說明吧。那怎么辦,只能自己動手了(自己動手豐衣足食)。
說說找出內置函數集合的過程吧。
1.首先內置函數應該在核心的計算引擎中,外部工具箱的函數應該不屬於(不排除其他工具箱中有部分函數也是內置函數)。
2.使用Matlab Help瀏覽器,打開核心組件Matlab的Functions節點,可以看到下面這些函數分類:
3.手動將這些大類中的函數手動復制到一個txt文本中,當然格式可能有點亂,不用管。
4.使用C#編寫一個簡單的函數,將上述txt文本進行處理,把函數名都截取出來,放到一個新的result.txt中。代碼如下:
1 using System; 2 using System.Text ; 3 using System.IO ; 4 5 namespace FunctionNameProcess 6 { 7 class Program 8 { 9 public static void Main(string[] args) 10 { 11 string fileName = @"funcname.txt" ; 12 string saveName = @"result.txt"; 13 TextWriter tw = new StreamWriter (saveName ,false ); 14 using (TextReader tr = new StreamReader (fileName )) 15 { 16 string temp ; 17 while ((temp = tr.ReadLine ())!=null ) 18 { 19 tw.WriteLine (GetBulidInFunction (temp )); 20 } 21 } 22 tw.Close (); 23 Console.Write("Press any key to continue . . . "); 24 Console.ReadKey(true); 25 } 26 27 public static string GetBulidInFunction(string name) 28 { 29 if (name !="") { 30 string[] names = name.Split ('\t'); 31 if (names!=null && names [0]!= "") { 32 return names [0]; 33 } 34 } 35 return ""; 36 } 37 } 38 }
5.最后在matlab中編寫一個簡單的批處理代碼,循環驗證result.txt中的函數名的信息,是否屬於內置函數即可。matlab代碼如下:
1 %導入數據后是cell類型的數據類型 2 %要進行轉換為字符串數組然后調用exist函數進行計算 3 %最終結果也應該是字符串數組,需要聲明,添加過程中類型不一樣會有錯誤 4 clc;clear; 5 newData = importdata('result.txt'); 6 vars = fieldnames(newData); 7 for i = 1:length(vars) 8 assignin('base', vars{i}, newData.(vars{i}));%在命名空間聲明變量 9 end 10 result = {};%聲明一個空的cell數組類型 11 for i = 1:size(textdata,1) 12 temp =cell2mat(textdata(i,1)); 13 resultNo = exist(temp); 14 if resultNo == 5 %返回5說明為內置函數 15 len = size(result,1); 16 result(len+1,1) = mat2cell(temp); 17 end 18 end
OK,可以在result中看到屬於內置函數的名稱了。剩下的怎么辦看你的了,本來想把這些函數都一一翻譯出來,可惜太大了,有1000多個,最后放棄了,把這個技巧分享給大家,“授人以魚不如授人以漁”,大家掌握了方法,其實也不難了。
備注:上面也提到了,其實也有可能其他工具箱也有一些內置函數,但工作量太大,沒有全部測試,只是猜測一下,大家以后混編的時候,可以先用exist檢測一下即可。至於這些核心組件中的內置函數,我也只測試了其中幾個,理論上應該都是可以直接調用的,也不排除有些函數由於其他原因不能用啊,大家對症下葯吧。
下次將分享如何在C#中直接調用這些內置函數,而不需要封裝。