亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

C語言實現MATLAB 6.5中M文件的方法

2019-11-17 05:02:14
字體:
來源:轉載
供稿:網友
摘要:本文著重描述了運用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語言實現MATLAB 6.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語言實現MATLAB 6.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命令將進一步翻譯內部嵌套的函數。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
精品久久久久久久久久久久久久| 2019国产精品自在线拍国产不卡| 日本高清视频一区| 日韩三级成人av网| 日韩有码在线观看| 国产一区二区三区在线观看网站| 国产91精品久久久| 亚洲综合社区网| 国产精品最新在线观看| 国产日产欧美a一级在线| 欧美影院久久久| 97精品久久久中文字幕免费| 91精品国产九九九久久久亚洲| 国产91精品久久久久久久| 91国内精品久久| 亚洲人精品午夜在线观看| 国产在线视频2019最新视频| 亚洲电影在线看| 亚洲欧美日韩综合| 日韩欧美在线免费观看| 久久久久久这里只有精品| 伊人伊人伊人久久| 久久久久久97| 亚洲国产精彩中文乱码av| 久久精品小视频| 日韩在线视频国产| 另类专区欧美制服同性| 中文字幕日本欧美| 成人网页在线免费观看| 国产日产欧美精品| 久久精品一偷一偷国产| 日韩在线播放av| 日韩视频免费在线观看| 福利二区91精品bt7086| 国产免费一区二区三区在线观看| 亚洲午夜av电影| 久久久久久综合网天天| 亚洲欧美日韩在线高清直播| 九色精品美女在线| 国产第一区电影| 一区二区国产精品视频| 亚洲一区二区三区视频| www.xxxx欧美| 日韩av影视综合网| 亚洲电影中文字幕| 欧美伊久线香蕉线新在线| 色噜噜狠狠色综合网图区| 日韩中文字幕不卡视频| 亚洲天堂第一页| 欧美日韩在线视频一区| 亚洲欧美成人在线| 欧美大片网站在线观看| 97久久精品人搡人人玩| 欧美精品www在线观看| 亚洲自拍小视频| 日韩av片电影专区| 日韩经典一区二区三区| 久久久免费观看| 日本三级韩国三级久久| 国内精品久久久久| 亚洲欧美日韩爽爽影院| 欧美裸身视频免费观看| 国产成人小视频在线观看| 国产精品99久久99久久久二8| 国产精品一区久久久| 亚洲色图偷窥自拍| 欧美一级淫片丝袜脚交| 欧美大片欧美激情性色a∨久久| 欧美色道久久88综合亚洲精品| 有码中文亚洲精品| 亚洲经典中文字幕| 国产成人一区二区三区| 一本大道香蕉久在线播放29| 日av在线播放中文不卡| 欧美激情亚洲另类| 国产91精品黑色丝袜高跟鞋| 中文精品99久久国产香蕉| 富二代精品短视频| 久久精品久久久久电影| 亚洲毛片在线观看| 亚洲伊人成综合成人网| 国产精品亚洲一区二区三区| 国产精品99久久久久久久久久久久| 国产精品大陆在线观看| 一本色道久久综合狠狠躁篇的优点| 久久综合色影院| 国产在线精品自拍| 亚洲一区二区免费在线| 国产精品综合久久久| 成人性生交大片免费看小说| 亚洲欧洲国产精品| 成人久久一区二区| 日本视频久久久| 日韩中文字幕在线视频| 欧美猛男性生活免费| 91国内产香蕉| 91亚洲精品在线观看| 欧美精品福利在线| 国产欧美日韩精品丝袜高跟鞋| 欧美日韩黄色大片| 欧美视频在线观看 亚洲欧| 欧美日本亚洲视频| 精品偷拍一区二区三区在线看| 日本免费一区二区三区视频观看| 成人欧美一区二区三区黑人孕妇| 亚洲免费电影在线观看| 91香蕉嫩草神马影院在线观看| 在线看欧美日韩| 欧美亚洲成人网| 国产一区二区三区三区在线观看| 在线播放国产一区中文字幕剧情欧美| 日韩精品在线观看视频| 国产精品久久久久久久久久99| 精品国内自产拍在线观看| 欧美精品成人91久久久久久久| 国产精品高清网站| 国产成人亚洲综合青青| 日韩美女视频中文字幕| 亚洲黄色www| 久久精品亚洲精品| 久久激情视频久久| 韩国三级日本三级少妇99| 海角国产乱辈乱精品视频| 91人成网站www| 国外成人在线视频| 国产日韩在线观看av| 伊人久久久久久久久久久久久| 国产精品亚洲欧美导航| 国产精品久久婷婷六月丁香| 久久久久中文字幕| 大胆人体色综合| 精品久久久久久久大神国产| 久久久999精品| 中文字幕亚洲自拍| 国产日韩欧美夫妻视频在线观看| 国产91在线视频| 久久久久久这里只有精品| 黄色一区二区三区| 日韩福利在线播放| 亚洲激情在线观看| 国产主播喷水一区二区| 欧美日韩一区二区免费视频| 日韩中文在线观看| 久久久久在线观看| 欧美日韩一区二区三区在线免费观看| 中文字幕亚洲欧美在线| 欧美黑人极品猛少妇色xxxxx| 国产成+人+综合+亚洲欧美丁香花| 成人高清视频观看www| 久久天天躁日日躁| 久99久在线视频| 国产精品一区久久久| 久久亚洲综合国产精品99麻豆精品福利| 91色在线视频| 69**夜色精品国产69乱| 国产在线视频91| 亚洲精品一区二三区不卡| 亚洲欧美国产另类| 精品福利在线观看| 亚洲国产精品嫩草影院久久| 久久久久久久久久久久久久久久久久av| 欧美不卡视频一区发布| 伊人成人开心激情综合网| 欧美日韩一区二区免费视频|