| 導購 | 订阅 | 在线投稿
分享
 
 
當前位置: 王朝網路 >> c/c++ >> C語言實現MATLAB6.5中M文件的方法
 

C語言實現MATLAB6.5中M文件的方法

2008-06-01 02:06:32  編輯來源:互聯網  简体版  手機版  評論  字體: ||
 
 
  摘要:本文著重描述了運用MATLAB命令將M文件翻譯爲C語言程序,並修改爲可直接調用的C語言函數的方法,使用該方法所需要注重的方法局限性和MATLAB版本差異的影響。運用該方法將能夠使C語言能直接使用MATLAB當中已經完成的數學計算功能,大大擴充了C語言的數學計算功能和開發效率。

  要害詞:MATLAB;M文件;C語言接口

  衆所周知,MATLAB是一個功能強大的數學軟件,擅長于用矩陣運算完成各種數學功能。但是其程序需要在MATLAB環境下解釋執行,效率不高。假如能將它強大的函數庫用于C語言,利用C來編譯執行,MATLAB將能發揮更大的作用。所以,MATLAB從5.0開始已經提供了與外部C/C++程序的應用程序接口,爲利用C語言調用MATLAB的函數提供了可能。但是MATLAB的接口發展很快,到MATLAB 6.5已經提供了對VC 7.0的支持,同時對C的接口相對于5.X版本有了一定的改變。

  在MATLAB當中,我們利用M文件來實現函數,每一個M文件實現一個單獨的功能,這一點和C語言當中的函數是相互對應的。所以,假如我們能將MATLAB中的M文件轉化爲C語言下的一個單個函數,就能實現MATLAB中相應的功能。

  實現方法

  整個過程可分爲三個主要部分,用MATLAB將M文件翻譯爲C語言文件,從生成的C語言文件提取出有用語句,編寫數據轉換程序實現參數格式轉換。整個過程最終將把M文件翻譯成C語言當中的一個具有相同功能的函數,供其它的程序調用。

  本文用一個最簡單的M文件來示例:

  文件名:messay.m

  function c=messay()

  a=3.4;

  b=5.6;

  c=sqrt(a)+sqrt(b);

  該m文件實現了計算
C語言實現MATLAB6.5中M文件的方法


  1、將M文件編譯爲C語言文件

  爲了將M文件翻譯爲C語言文件,需要進行一定的設置,這裏假設編寫C語言的環境爲VC6.0,在MATLAB命令提示符下輸入mex -setup和mbuild -setup命令,在相應選項中選擇Microsoft Visual C/C++即可。

  在MATLAB命令行中使用mcc命令將messay.m翻譯爲C代碼。

  mcc -m messay.m

  其中的參數-m代表mcc命令將把m文件翻譯成C語言的代碼。

  翻譯命令將在messay.m所在的文件夾下生成三個C語言文件:messay.h,messay.c和messay_main.c。其中messay_main.c提供了main()函數;messay.h提供了整個程序的函數聲明;messay.c包含了MATLAB生成的功能函數。這三個文件當中,messay.c中包含了我們所需要的數學函數。

  2、提取有用語句

  通過分析,發現由mcc生成的代碼內部參數傳送方式由MATLAB鏈接庫規定,難以改動,因此需要提取有用的代碼,並更改生成代碼的參數傳遞方式。同時從生成代碼的注釋中可以看出,真正蘊含M文件功能實現的代碼段都在Mmessay()函數當中(該函數名的默認構造方式爲前綴M加上M文件的文件名),而其它的生成函數僅實現參數傳遞和標准化接口服務的功能。

  所以提取代碼的具體方法是利用messay.c當中生成的static mxArray * Mmessay(int nargout_)函數,對該函數進行修改,而其他的生成函數都可以忽略不用。原生成的Mmessay()代碼如下:

  static mxArray * Mmessay(int nargout_) {

  mexLocalFunctionTable save_local_function_table = mclSetCurrentLocalFunctionTable(&_local_function_table_messay);

  mxArray * c = NULL;

  mxArray * b = NULL;

  mxArray * a = NULL;

  mlfAssign(&a, _mxarray0_);

  mlfAssign(&b, _mxarray1_);

  mlfAssign(&c, mclPlus(mlfSqrt(mclVv(a, "a")), mlfSqrt(mclVv(b, "b"))));

  mclValidateOutput(c, 1, nargout_, "c", "messay");

  mxDestroyArray(a);

  mxDestroyArray(b);

  mclSetCurrentLocalFunctionTable(save_local_function_table_);

  return c;

  }

  在生成代碼當中,mclSetCurrentLocalFunctionTable和mclSetCurrentLocalFunctionTable函數爲兩個外部函數,將參數傳給外部,與其相關的部分都對C程序使用數學函數沒有影響。最終實際有用並執行運算的只有一句:

  mlfAssign(&c, mclPlus(mlfSqrt(mclVv(a, "a")), mlfSqrt(mclVv(b, "b"))));

  實際上,由MATLAB翻譯的C語句中,大部分的和實際計算有關的語句和自生成的函數都以mlf開頭,所以尋找有用語句的簡單方法就是直接尋找mlf爲前綴的代碼。

  3、參數格式轉換

  應當指出,MATLAB所有的計算都是基于一種名爲mxArray的數據結構之上的,所有的浮點數、向量或者是矩陣在MATLAB當中都是通過mxArray結構來進行存儲和傳遞的。當然,MATLAB所提供的所有數學函數也都是基于這樣一種數據結構進行運算的。所以,要使用MATLAB的生成代碼,就必須將C語言當中常用的浮點數和整數轉換爲mxArray結構。

  

  

  本例中利用MATLAB函數mxArray *mlfScalar(double v)和函數double *mxGetPR(mxArray *)來實現參數格式轉換。函數mlfScalar()將double型變量存入一個新建的mxArray結構中,並返回指針,而函數mxGetPr()將mxArray結構保存的實數的實部取出。至于其它參數轉換方法可參看參考文獻3中的相關部分。

  最終可以編寫這樣一個利用了MATLAB數學函數並實現
C語言實現MATLAB6.5中M文件的方法
計算的函數:

  double Mmessay(double ina, double inb) {

  mxArray *a,*b,*c; //三個用于MATLAB數學函數計算的參數

  double *outc; //計算結果變量

  a=mlfScalar((double)ina); //利用mlfScalar()進行類型轉換

  b=mlfScalar((double)inb);

  mlfAssign(&c, mclPlus(mlfSqrt(mclVv(a, "a")), mlfSqrt(mclVv(b, "b"))));

  outc=mxGetPr(c); //c獲得結果的實部,即結果

  mxDestroyArray(a); //釋放空間

  mxDestroyArray(b);

  mxDestroyArray(c);

  return *outc;

  }

  到此,整個翻譯過程完成,但是還不能直接調用。在這個函數當中運用到了MATLAB的數學庫函數mlfSqrt()、mlcPlus()和數據轉換函數mlfScalar()、mxGetPr()。由于這些函數是固化在鏈接庫當中的,爲了連接執行,必須加入幾個庫文件和幾個靜態鏈接庫lib文件。所需要的庫文件爲mcc命令生成的messay.c文件當中所加入的庫文件,一般爲libmatlb.h,而需要加入的靜態鏈接庫文件如下:

  libmat.lib,libmatlb.lib,libmex.lib,libmx.lib

  假如沒有以上文件,可以用VC的lib命令將MATLAB相應的def文件轉化爲lib文件,轉化格式爲lib /def:filename.def /machine:ix86 /out:filename.lib。QQread.com 推出Windows2003教程 win2003安裝介紹 win2003網絡優化 win2003使用技巧 win2003系統故障 服務器配置 專家答疑

  更多的請看:http://www.qqread.com/windows/2003/index.Html

  方法的局限

  使用本文所用的方法可以將M文件翻譯爲C語言的函數,但是要受到兩個因素的制約。

  1、功能的實現受到MATLAB C函數庫的限制

  這種翻譯的機制是由MATLAB提供的,mcc命令能直接翻譯的函數也僅局限于MATLAB原有的函數。因爲這些函數已經被MATLAB6.5編譯好,一般以mlf爲前綴,存于動態鏈接庫當中並可被C語言直接調用。這些函數在參考文獻4中可以查到。而超出了這個範圍的函數,並在M文件當中被嵌套使用,在用mcc進行翻譯的時候,mcc將在函數名前加上前綴mlf,並進一步翻譯該函數。

  但是,這種翻譯受到MATLAB參數傳遞的限制,而不能直接調用,在編譯時會出現找不到相應的外部函數的錯誤。解決辦法是手動將所有被翻譯的函數進行參數傳遞方式的調整。假如M文件當中包含的函數被嵌套翻譯的層數很深,這樣的工作量是巨大而且不可接受的。

  同時很多工具箱當中定義的函數也是不能使用這種方法進行翻譯的。MATLAB的工具箱更新速度很快,而相應的MATLAB C的函數庫有一定滯後,導致很多最新的工具箱當中的函數是不能被翻譯的。

  2、翻譯本身存在的限制

  因爲這種翻譯是遵守C語言要求的,因而對于內存分配要求和C語言不同的函數和一些關于圖形顯示類型的函數(包括大量的GUI相關函數)也不能被正確的翻譯。例如mash.m和step.m這兩個較常用的MATLAB函數,由于上述的限制,就不能用本方法進行翻譯。

  對于上述的問題,可以利用在C程序當中運用MATLAB引擎的方法動態調用MATLAB的庫函數,基本上可以解決上述所有的函數不能被正確翻譯和圖形顯示的問題。但是,運用MATLAB引擎的方法需要利用ActiveX的自動化服務器,在運行的時候程序會在後台執行一個MATLAB的線程而不能完全脫離MATLAB的環境,也就意味著在純C的環境下是不能運用的,必須要先安裝MATLAB並能夠在運行時支持多線程工作。具體的方法可以參閱參考文獻3。

  MATLAB 5.X和MATLAB 6.5的區別

  對于本方法有以下幾點區別需要注重:

  (1)程序當中所需的庫文件由5.X版本的matrix.h、mcc.h、matlab.h改爲mex.h、libmatlb.h、libmatlbm.h等庫文件。

  (2)程序所需要加入的靜態鏈接庫文件由5.X需要的libmmfile.lib、libmatlb.lib、libmcc.lib、libmx.lib改爲libmat.lib、libmatlb.lib、libmex.lib、libmx.lib四個文件。

  (3)API函數改動很多,雖然數學函數庫即mlf前綴的函數少有改動,但是關于變量建立,內存治理和數據類型轉換的函數發生改變,即很多原mcc前綴的函數改爲用mx爲前綴的函數代替,使得很多5.X翻譯的C程序代碼不能在6.5相應的庫下運行通過。

  (4)6.5版本中直接增加了在VC環境下對M文件的支持。在執行mbuild -setup的配置命令後,MATLAB在VC中提供了MATLAB Project Wizard,可在VC環境下直接建立MATLAB的工程來翻譯M文件。但是這種翻譯方法在碰到未定義函數嵌套時將錯誤的把函數名翻譯爲變量名,而mcc命令將進一步翻譯內部嵌套的函數。
 
 
 
上一篇《C程序實現漢字內碼與GB碼》
下一篇《Linux 下 C++程序的異常處理技巧》
 
 
 
 
 
 
日版寵物情人插曲《Winding Road》歌詞

日版寵物情人2017的插曲,很帶節奏感,日語的,女生唱的。 最後聽見是在第8集的時候女主手割傷了,然後男主用嘴幫她吸了一下,插曲就出來了。 歌手:Def...

兄弟共妻,我成了他們夜裏的美食

老鍾家的兩個兒子很特別,就是跟其他的人不太一樣,魔一般的執著。兄弟倆都到了要結婚的年齡了,不管自家老爹怎麽磨破嘴皮子,兄弟倆說不娶就不娶,老父母爲兄弟兩操碎了心...

如何磨出破洞牛仔褲?牛仔褲怎麽剪破洞?

把牛仔褲磨出有線的破洞 1、具體工具就是磨腳石,下面墊一個硬物,然後用磨腳石一直磨一直磨,到把那塊磨薄了,用手撕開就好了。出來的洞啊很自然的。需要貓須的話調幾...

我就是掃描下圖得到了敬業福和愛國福

先來看下敬業福和愛國福 今年春節,支付寶再次推出了“五福紅包”活動,表示要“把欠大家的敬業福都還給大家”。 今天該活動正式啓動,和去年一樣,需要收集“五福”...

冰箱異味産生的原因和臭味去除的方法

有時候我們打開冰箱就會聞到一股異味,冰箱裏的這種異味是因爲一些物質發出的氣味的混合體,聞起來讓人惡心。 産生這些異味的主要原因有以下幾點。 1、很多人有這種習...

《極品家丁》1-31集大結局分集劇情介紹

簡介 《極品家丁》講述了現代白領林晚榮無意回到古代金陵,並追隨蕭二小姐化名“林三”進入蕭府,不料卻陰差陽錯上演了一出低級家丁拼搏上位的“林三升職記”。...

李溪芮《極品家丁》片尾曲《你就是我最愛的寶寶》歌詞

你就是我最愛的寶寶 - 李溪芮 (電視劇《極品家丁》片尾曲) 作詞:常馨內 作曲:常馨內 你的眉 又鬼馬的挑 你的嘴 又壞壞的笑 上一秒吵鬧 下...

烏梅的功效與作用以及烏梅的食用禁忌有哪些?

烏梅,又稱春梅,中醫認爲,烏梅味酸,性溫,無毒,具有安心、除熱、下氣、祛痰、止渴調中、殺蟲的功效,治肢體痛、肺痨病。烏梅泡水喝能治傷寒煩熱、止吐瀉,與幹姜一起制...

什麽是脂肪粒?如何消除臉部脂肪粒?

什麽是脂肪粒 在我們的臉上總會長一個個像脂肪的小顆粒,弄也弄不掉,而且顔色還是白白的。它既不是粉刺也不是其他的任何痘痘,它就是脂肪粒。 脂肪粒雖然也是由油脂...

網絡安全治理:國家安全保障的主要方向是打擊犯罪,而不是處置和懲罰受害者

來源:中國青年報 新的攻擊方法不斷湧現,黑客幾乎永遠占據網絡攻擊的上風,我們不可能通過技術手段杜絕網絡攻擊。國家安全保障的主要方向是打擊犯罪,而不是處置和懲罰...

河南夫妻在溫嶺網絡直播“造人”內容涉黃被刑事拘留

夫妻網絡直播“造人”爆紅   1月9日,溫嶺城北派出所接到南京警方的協查通告,他們近期打掉了一個涉黃直播APP平台。而根據掌握的線索,其中有一對涉案的夫妻主播...

如何防止牆紙老化?牆紙變舊變黃怎麽辦?

如何防止牆紙老化? (1)選擇透氣性好的牆紙 市場上牆紙的材質分無紡布的、木纖維的、PVC的、玻璃纖維基材的、布面的等,相對而言,PVC材質的牆紙最不透氣...

鮮肌之謎非日本生産VS鮮肌之謎假日貨是謠言

觀點一:破日本銷售量的“鮮肌之謎” 非日本生産 近一段時間,淘寶上架了一款名爲“鮮肌之謎的” 鲑魚卵巢美容液,號稱是最近日本的一款推出的全新護膚品,産品本身所...

中國最美古詩詞精選摘抄

系腰裙(北宋詞人 張先) 惜霜蟾照夜雲天,朦胧影、畫勾闌。人情縱似長情月,算一年年。又能得、幾番圓。 欲寄西江題葉字,流不到、五亭前。東池始有荷新綠,尚小如...

關于女人的經典語句

關于女人的經典語句1、【做一個獨立的女人】 思想獨立:有主見、有自己的人生觀、價值觀。有上進心,永遠不放棄自己的理想,做一份自己喜愛的事業,擁有快樂和成就...

未來我們可以和性愛機器人結婚嗎?

你想體驗機器人性愛嗎?你想和性愛機器人結婚嗎?如果你想,機器人有拒絕你的權利嗎? 近日,第二屆“國際人類-機器人性愛研討會”大會在倫敦金史密斯大學落下帷幕。而...

全球最變態的十個地方

10.土耳其地下洞穴城市 變態指數:★★☆☆☆ 這是土耳其卡帕多西亞的一個著名景點,傳說是當年基督教徒們爲了躲避戰爭而在此修建。裏面曾住著20000人,...

科學家稱,人類死亡後意識將在另外一個宇宙中繼續存活

據英國《每日快報》報道,一位科學家兼理論家Robert Lanza博士宣稱,世界上並不存在人類死亡,死亡的只是身體。他認爲我們的意識借助我們體內的能量生存,而且...

《屏裏狐》片頭曲《我愛狐狸精》歌詞是什麽?

《我愛狐狸精》 - 劉馨棋   (電視劇《屏裏狐》主題曲)   作詞:金十三&李旦   作曲:劉嘉   狐狸精 狐狸仙   千年修...

 
 
 
摘要:本文著重描述了運用MATLAB命令將M文件翻譯爲C語言程序,並修改爲可直接調用的C語言函數的方法,使用該方法所需要注重的方法局限性和MATLAB版本差異的影響。運用該方法將能夠使C語言能直接使用MATLAB當中已經完成的數學計算功能,大大擴充了C語言的數學計算功能和開發效率。   要害詞:MATLAB;M文件;C語言接口   衆所周知,MATLAB是一個功能強大的數學軟件,擅長于用矩陣運算完成各種數學功能。但是其程序需要在MATLAB環境下解釋執行,效率不高。假如能將它強大的函數庫用于C語言,利用C來編譯執行,MATLAB將能發揮更大的作用。所以,MATLAB從5.0開始已經提供了與外部C/C++程序的應用程序接口,爲利用C語言調用MATLAB的函數提供了可能。但是MATLAB的接口發展很快,到MATLAB 6.5已經提供了對VC 7.0的支持,同時對C的接口相對于5.X版本有了一定的改變。   在MATLAB當中,我們利用M文件來實現函數,每一個M文件實現一個單獨的功能,這一點和C語言當中的函數是相互對應的。所以,假如我們能將MATLAB中的M文件轉化爲C語言下的一個單個函數,就能實現MATLAB中相應的功能。   實現方法   整個過程可分爲三個主要部分,用MATLAB將M文件翻譯爲C語言文件,從生成的C語言文件提取出有用語句,編寫數據轉換程序實現參數格式轉換。整個過程最終將把M文件翻譯成C語言當中的一個具有相同功能的函數,供其它的程序調用。   本文用一個最簡單的M文件來示例:   文件名:messay.m function c=messay() a=3.4; b=5.6; c=sqrt(a)+sqrt(b);   該m文件實現了計算[url=/bbs/detail_1785378.html][img]http://image.wangchao.net.cn/it/1323423675903.gif[/img][/url]   1、將M文件編譯爲C語言文件   爲了將M文件翻譯爲C語言文件,需要進行一定的設置,這裏假設編寫C語言的環境爲VC6.0,在MATLAB命令提示符下輸入mex -setup和mbuild -setup命令,在相應選項中選擇Microsoft Visual C/C++即可。   在MATLAB命令行中使用mcc命令將messay.m翻譯爲C代碼。 mcc -m messay.m   其中的參數-m代表mcc命令將把m文件翻譯成C語言的代碼。   翻譯命令將在messay.m所在的文件夾下生成三個C語言文件:messay.h,messay.c和messay_main.c。其中messay_main.c提供了main()函數;messay.h提供了整個程序的函數聲明;messay.c包含了MATLAB生成的功能函數。這三個文件當中,messay.c中包含了我們所需要的數學函數。   2、提取有用語句   通過分析,發現由mcc生成的代碼內部參數傳送方式由MATLAB鏈接庫規定,難以改動,因此需要提取有用的代碼,並更改生成代碼的參數傳遞方式。同時從生成代碼的注釋中可以看出,真正蘊含M文件功能實現的代碼段都在Mmessay()函數當中(該函數名的默認構造方式爲前綴M加上M文件的文件名),而其它的生成函數僅實現參數傳遞和標准化接口服務的功能。   所以提取代碼的具體方法是利用messay.c當中生成的static mxArray * Mmessay(int nargout_)函數,對該函數進行修改,而其他的生成函數都可以忽略不用。原生成的Mmessay()代碼如下: static mxArray * Mmessay(int nargout_) {  mexLocalFunctionTable save_local_function_table = mclSetCurrentLocalFunctionTable(&_local_function_table_messay);  mxArray * c = NULL;  mxArray * b = NULL;  mxArray * a = NULL;  mlfAssign(&a, _mxarray0_);  mlfAssign(&b, _mxarray1_);  mlfAssign(&c, mclPlus(mlfSqrt(mclVv(a, "a")), mlfSqrt(mclVv(b, "b"))));  mclValidateOutput(c, 1, nargout_, "c", "messay");  mxDestroyArray(a);  mxDestroyArray(b);  mclSetCurrentLocalFunctionTable(save_local_function_table_);  return c; }   在生成代碼當中,mclSetCurrentLocalFunctionTable和mclSetCurrentLocalFunctionTable函數爲兩個外部函數,將參數傳給外部,與其相關的部分都對C程序使用數學函數沒有影響。最終實際有用並執行運算的只有一句: mlfAssign(&c, mclPlus(mlfSqrt(mclVv(a, "a")), mlfSqrt(mclVv(b, "b"))));   實際上,由MATLAB翻譯的C語句中,大部分的和實際計算有關的語句和自生成的函數都以mlf開頭,所以尋找有用語句的簡單方法就是直接尋找mlf爲前綴的代碼。   3、參數格式轉換   應當指出,MATLAB所有的計算都是基于一種名爲mxArray的數據結構之上的,所有的浮點數、向量或者是矩陣在MATLAB當中都是通過mxArray結構來進行存儲和傳遞的。當然,MATLAB所提供的所有數學函數也都是基于這樣一種數據結構進行運算的。所以,要使用MATLAB的生成代碼,就必須將C語言當中常用的浮點數和整數轉換爲mxArray結構。   本例中利用MATLAB函數mxArray *mlfScalar(double v)和函數double *mxGetPR(mxArray *)來實現參數格式轉換。函數mlfScalar()將double型變量存入一個新建的mxArray結構中,並返回指針,而函數mxGetPr()將mxArray結構保存的實數的實部取出。至于其它參數轉換方法可參看參考文獻3中的相關部分。   最終可以編寫這樣一個利用了MATLAB數學函數並實現[url=/bbs/detail_1785378.html][img]http://image.wangchao.net.cn/it/1323423675932.gif[/img][/url]計算的函數: double Mmessay(double ina, double inb) {  mxArray *a,*b,*c; //三個用于MATLAB數學函數計算的參數  double *outc; //計算結果變量  a=mlfScalar((double)ina); //利用mlfScalar()進行類型轉換  b=mlfScalar((double)inb);  mlfAssign(&c, mclPlus(mlfSqrt(mclVv(a, "a")), mlfSqrt(mclVv(b, "b"))));  outc=mxGetPr(c); //c獲得結果的實部,即結果  mxDestroyArray(a); //釋放空間  mxDestroyArray(b);  mxDestroyArray(c);  return *outc; }   到此,整個翻譯過程完成,但是還不能直接調用。在這個函數當中運用到了MATLAB的數學庫函數mlfSqrt()、mlcPlus()和數據轉換函數mlfScalar()、mxGetPr()。由于這些函數是固化在鏈接庫當中的,爲了連接執行,必須加入幾個庫文件和幾個靜態鏈接庫lib文件。所需要的庫文件爲mcc命令生成的messay.c文件當中所加入的庫文件,一般爲libmatlb.h,而需要加入的靜態鏈接庫文件如下: libmat.lib,libmatlb.lib,libmex.lib,libmx.lib   假如沒有以上文件,可以用VC的lib命令將MATLAB相應的def文件轉化爲lib文件,轉化格式爲lib /def:filename.def /machine:ix86 /out:filename.lib。QQread.com 推出Windows2003教程 win2003安裝介紹 win2003網絡優化 win2003使用技巧 win2003系統故障 服務器配置 專家答疑 更多的請看:http://www.qqread.com/windows/2003/index.Html   方法的局限   使用本文所用的方法可以將M文件翻譯爲C語言的函數,但是要受到兩個因素的制約。   1、功能的實現受到MATLAB C函數庫的限制   這種翻譯的機制是由MATLAB提供的,mcc命令能直接翻譯的函數也僅局限于MATLAB原有的函數。因爲這些函數已經被MATLAB6.5編譯好,一般以mlf爲前綴,存于動態鏈接庫當中並可被C語言直接調用。這些函數在參考文獻4中可以查到。而超出了這個範圍的函數,並在M文件當中被嵌套使用,在用mcc進行翻譯的時候,mcc將在函數名前加上前綴mlf,並進一步翻譯該函數。   但是,這種翻譯受到MATLAB參數傳遞的限制,而不能直接調用,在編譯時會出現找不到相應的外部函數的錯誤。解決辦法是手動將所有被翻譯的函數進行參數傳遞方式的調整。假如M文件當中包含的函數被嵌套翻譯的層數很深,這樣的工作量是巨大而且不可接受的。 同時很多工具箱當中定義的函數也是不能使用這種方法進行翻譯的。MATLAB的工具箱更新速度很快,而相應的MATLAB C的函數庫有一定滯後,導致很多最新的工具箱當中的函數是不能被翻譯的。   2、翻譯本身存在的限制   因爲這種翻譯是遵守C語言要求的,因而對于內存分配要求和C語言不同的函數和一些關于圖形顯示類型的函數(包括大量的GUI相關函數)也不能被正確的翻譯。例如mash.m和step.m這兩個較常用的MATLAB函數,由于上述的限制,就不能用本方法進行翻譯。   對于上述的問題,可以利用在C程序當中運用MATLAB引擎的方法動態調用MATLAB的庫函數,基本上可以解決上述所有的函數不能被正確翻譯和圖形顯示的問題。但是,運用MATLAB引擎的方法需要利用ActiveX的自動化服務器,在運行的時候程序會在後台執行一個MATLAB的線程而不能完全脫離MATLAB的環境,也就意味著在純C的環境下是不能運用的,必須要先安裝MATLAB並能夠在運行時支持多線程工作。具體的方法可以參閱參考文獻3。   MATLAB 5.X和MATLAB 6.5的區別   對于本方法有以下幾點區別需要注重:   (1)程序當中所需的庫文件由5.X版本的matrix.h、mcc.h、matlab.h改爲mex.h、libmatlb.h、libmatlbm.h等庫文件。   (2)程序所需要加入的靜態鏈接庫文件由5.X需要的libmmfile.lib、libmatlb.lib、libmcc.lib、libmx.lib改爲libmat.lib、libmatlb.lib、libmex.lib、libmx.lib四個文件。   (3)API函數改動很多,雖然數學函數庫即mlf前綴的函數少有改動,但是關于變量建立,內存治理和數據類型轉換的函數發生改變,即很多原mcc前綴的函數改爲用mx爲前綴的函數代替,使得很多5.X翻譯的C程序代碼不能在6.5相應的庫下運行通過。   (4)6.5版本中直接增加了在VC環境下對M文件的支持。在執行mbuild -setup的配置命令後,MATLAB在VC中提供了MATLAB Project Wizard,可在VC環境下直接建立MATLAB的工程來翻譯M文件。但是這種翻譯方法在碰到未定義函數嵌套時將錯誤的把函數名翻譯爲變量名,而mcc命令將進一步翻譯內部嵌套的函數。
󰈣󰈤
 
 
 
  免責聲明:本文僅代表作者個人觀點,與王朝網路無關。王朝網路登載此文出於傳遞更多信息之目的,並不意味著贊同其觀點或證實其描述,其原創性以及文中陳述文字和內容未經本站證實,對本文以及其中全部或者部分內容、文字的真實性、完整性、及時性本站不作任何保證或承諾,請讀者僅作參考,並請自行核實相關內容。
 
 
陽光靓麗的模特兒(8)
陽光靓麗的模特兒(7)
陽光靓麗的模特兒(6)
陽光靓麗的模特兒(5)
秋-印象
德慶盤龍峽 一
松江印象之三
雲之南(寬幅)
 
>>返回首頁<<
 
 
 
 熱帖排行
 
 
 
 
© 2005- 王朝網路 版權所有