m檔案轉換為c/c++檔案的編譯、繪圖、引數、打包問題總結
在工程計算相關專案中,常常利用matlab來完成計算、演算法、繪圖等功能。使用matlab來完成這些功能非常簡單,matlab提供的m程式語言功能強大,**量少。為了在自己的c/c++專案中加入這些功能,需要一系列繁瑣的過程,令很多人望之卻步。
主要的困難在於:
l如何從m檔案生成vc可用的c/c++**;
l如何設定編譯引數,在vc中編譯這些**;
l如何在c/c++語言中設定輸入輸出引數,使之與m**生成的c++**一同執行;
l如何製作包含matlab執行時庫的安裝程式。
下面結合網路上面的資料,對以上問題進行了總結,較好的解決了上面的問題。我使用的相關開發環境如下:matlaba6.5;vc6;windowsxp。
一 1引子
進入正文之前,要說說寫這篇文章的起因。近幾天發現乙個半年前寫的程式出現了莫名其妙的bug。在程式退出時總有乙個執行緒死掉不能退出,導致整個程序不能正常退出,必須從程序管理器中殺掉。
由於該程式一共有7個子執行緒,我乙個個檢查後發現程式在執行時有乙個並非由我建立的多餘子執行緒。通過process viewer和spy++等工具觀察發現,該執行緒中有以下幾個視窗ime、tthreadwindow和msctfimeui,查來查去毫無頭緒。
首先懷疑是多執行緒庫有bug,因此仔細重讀了一遍自己封裝的多線庫,還真的發現了幾個bug,但是修正後於事無補。花費了三天時間;
然後懷疑是介面庫有問題,仔細比較了使用介面庫和不使用介面庫前後的差別發現介面庫會多啟動兩個介面管理執行緒,但是都會正常退出,沒有問題。花費一天時間;
最後只好懷疑是引入的dll啟動了某個執行緒。乙個個排查dll,終於發現了和這兩個可疑的dll。這兩個dll是由mideva(將m檔案轉換為c/c++**的乙個中間工具)引入的。
當初使用mideva就是因為在直接使用matlab的mcc出現了困難,不得已找mideva代替。很多人還信誓旦旦的說mideva是最適宜vc使用的m**轉換工具。很多書和網路資料都還給出了示例**,我就不相信他們沒有碰到這個執行緒問題,只是避而不談罷了。
想起mideva已經被mathwork公司收購並且不再支援了,我就決心放棄mideva,繼續使用mcc來生成**。所有的歷程都記錄如下。
二 2m檔案轉換為c/c++檔案
要在vc中使用m檔案,方法有很多種。
最簡單的我認為還是使用mideva,當然如果你能夠搞定那個執行緒問題,並且永遠只使用matlab6以前的版本,你就可以使用mideva。這裡就不介紹了。
第二種就是使用matlab引擎來呼叫m檔案,也比較簡單,但是你必須在目標機器上安裝matlab才行,這往往是不現實的。
第三種使用mcc將m檔案編譯成為c/c++**,然後匯入vc編譯,因為常常生成很多源**,使用很繁瑣,這個很多網路資料已經說過。
第四種就是使用mcc將m檔案編譯為標頭檔案、dll和lib然後匯入vc編譯。目前這是最可行的一種方法。本文引用了首發於哈工大紫丁香站bbs的fork (撒哈拉沙漠的沙)寫的解決方法。
並做了一些文字上的修改。fork的例子有些簡單,沒有涉及多維資料引數的構建與輸入,也沒有多字串組引數的構建,因此我重寫了乙個較為實用的例子來展示他的內容。
三 2.1例子
例子的內容是通過輸入的資料來展示農作物產量的統計圖,其m**如下:
function result = mystat(mstatmatrix,mnamematrix,n)
%畫出柱狀圖來展示各個不同季度的農作物產量
% mstatmatrix代表農作物產量矩陣,每行為乙個地區,每行第一列為小麥產量,第二列為玉公尺產量;
% mnamematrix代表地區名稱字串陣列;
% n代表地區個數
%返回值為所有地區糧食總產量
bar(mstatmatrix);
xlabel('地區名稱');
ylabel('產量');
title('農作物產量統計');
legend('小麥','玉公尺',1);
totalnum = 0;
for i=1:n
text(i,max(mstatmatrix(i,1),mstatmatrix(i,2))+0.25,mnamematrix(i));
totalnum = totalnum + mstatmatrix(i,1)+mstatmatrix(i,2);
endset(gcf,'menubar','none');
result = totalnum;
在matlab中輸入如下命令:
data=[1,2;3,4;5,6;1,1]
name=
n=4mystat(data,name,n)
可以得到圖如下:
返回值為23。
四 2.2mcc生成**
輸入:(格式:mcc -t -w libhg:《庫名稱》 -t link:lib -h 檔名)
mcc -t -w libhg:mystatlib -t link:lib -h mystat
然後你會在你的工作目錄下找到三個檔案。這三個檔案就是vc程式設計所需要的。乙個有趣的bug是,你的庫名稱不能和m檔名稱相同,否則mcc會報錯,因為有些中間檔案重名了。
五 2.3在vc中新增
在vc中建乙個基於對話方塊的mfc應用程式,名字為teststat,新增乙個按鈕,並新增按鈕響應函式,函式內容在第五步中說明。將上面生成的3個檔案拷貝到vc工程的teststat目錄裡。
六 2.4設定vc
在vc中選擇:工程--->設定,再選屬性表link選項,下拉列表中選擇input,在物件/庫模組中加入附錄a中所列出的內容,注意用空格將它們格開而在忽略。庫中加入附錄b中列出的內容;再選擇屬性表c/c++選項,下拉列表選general,在預處理程式定義中新增附錄c中的內容,原來有的內容要保留,並注意用逗號將它們隔開。
再選擇下拉列表的precompiled headers選項,選擇「自動使用預補償頁首」,在其中新增確定。
七 2.5設定標頭檔案和庫檔案路徑
選擇:工具--->選擇,屬性頁選擇「目錄」,在include files裡面加入:
c:"matlab6p5"extern"include;
c:"matlab6p5"extern"include"cpp
注意,根據你的matlab的安裝位置的不同,要相應的修改上面的位址。在library files裡面加入:
c:"matlab6p5"extern"lib"win32
c:"matlab6p5"extern"lib"win32"microsoft"msvc60
注意,根據你的matlab的安裝位置的不同,要相應的修改上面的位址。
八 2.6新增響應**
在按鈕響應函式所在檔案中新增如下的標頭檔案:詳細的解釋見下一章引數問題。
......
#include ""
......
函式響應**為:
mxarray * mstatmatrix = null;
mxarray * mnamematrix = null;
mxarray * n;
//給2維陣列賦值,是乙個3*2陣列
mstatmatrix = mxcreatedoublematrix(4,2,mxreal);
int mrows = mxgetm(mstatmatrix);//行數
int ncols = mxgetn(mstatmatrix);//列數
double* data = mxgetpr(mstatmatrix);//矩陣的資料位址
double setdata[4][2] = ,,,}; //源資料,也可為二維陣列
for (int i = 0; i < mrows; i++) }
//建立乙個cell陣列來存放字串陣列
intdim[1] ;
dim[0] = 4;
mnamematrix = mxcreatecellarray(1,dim);
//給cell陣列賦值
for (int x = 0; x < 4; x++)
//給n賦值
n = mxcreatescalardouble(4);
將文字已圖形化的PDF檔案轉換為格式之方法
台北縣 新莊區人事人員集中辦公中心編制 96.05.15 以adobe reader 程式開啟文字尚未被圖形化的pdf檔案時,可輕易將其中文字拷貝轉貼至其他文書編輯軟體進一步編修,有效減少重複繕打之不便。但如該pdf檔案之文字已被圖形化時,則拷貝全然無用武之地,只能辛苦的重新登打。以下茲介紹以mic...
Matlab中m檔案的命名規則
matlab的.m檔案儲存的命名規則 1.檔名命名要用英文本元,第乙個字元不能是數字 下劃線呢?2.檔名不要取為matlab的乙個固有函式,m檔名的命名盡量不要是簡單的英文單詞,最好是由大小寫英文 數字 下劃線等組成。原因是簡單的單詞命名容易與matlab內部函式名同名,結果會出現一些莫名其妙的錯誤...
未在Excel檔案格式轉換中進行轉換的格式和功能
microsoft excel 工作簿檔案格式儲存所有工作表和圖表資料 格式 巨集以及其他 excel 2003 中的可用功能。如果將 excel 2003 工作簿以其他檔案格式儲存,則其中的某些格式 資料 巨集和其他功能可能會丟失。有關相容性的詳細資訊,請參閱 microsoft office20...