<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
首先把matlab程式碼封裝成函數形式,下面舉一個例子,myadd是主函數:
function c = myadd(a, b) c =ADD(a, b); end
function A = ADD(a, b) c = a + b; end
具體編譯步驟為:
1、輸出mex -setup 回車,然後點選選擇 mex -setup C++;
2、輸入mbuild -setup 回車,然後點選選擇 mex -setup C++ -client MBUILD;
3、輸入 mcc -W cpplib:addtest -T link:lib myadd.m -C;
(1)-W 是控制編譯之後的封裝格式;
(2)cpplib 是指編譯成 C++ 的 lib,如果需要編譯成 C 的 lib,就用 lib 即可,去掉 cpp;
(3)cpplib 後面的是需要生成檔案的檔名,是自己取的,我們取名為 addtest;
(4)-T表示目標,link:lib表示要連線到一個庫檔案的目標,目標的名字即是.m函數的名字;
(5)其他具體含義可以通過mcc –help命令檢視,注意引數的大小寫
4、編譯完成後會生成:addtest.ctf、addtest.dll、addtest.lib、addtest.h、
addtest.cpp、addtest.def、addtest.exp、addtest.exports 等四個檔案,但是在C++ 呼叫時只用到了前四個:
說明:建立工程檔案,注意:測試環境使用的是64位元作業系統,因此務必在x64環境下進行以下設定。(這是與你的matlab版本匹配的,我的matlab安裝的是64bit的)
1、C++目錄
找到自己 Matlab 的安裝目錄按照以下進行設定;
(1)包含目錄:D:Matlab2020aexterninclude
(2)庫目錄:D:Matlab2020aexternlibwin64microsoft
說明:如果未安裝matlab,則需要去已安裝過 matlab 的電腦上找到上述兩個路徑所對應的檔案
然後將其複製到該電腦,最後將其路徑新增至包含目錄和庫目錄即可!!!
2、連結器->輸入->附加依賴項,新增以下庫
mclmcrrt.lib、libmat.lib、libmx.lib、mclmcr.lib、addtest.lib(編譯 matlab 函數時生成的檔案);
3、設定系統變數(已修改)
“我的電腦”右鍵,開啟“屬性”;選擇“高階系統設定”;找到系統屬性頁面的“高階”選項,右下方
“環境變數”;頁面中下方是系統變數,將如下路徑新增到環境變數的Path中:
(1)如果電腦上裝的有 matlab 則僅需要新增如下路徑:
D:Matlab2020abinwin64
(2)如果電腦上沒有安裝 matlab 則需要新增如下路徑:
劃重點:電腦未安裝matlab是除了要新增上述路徑還需要安裝MCR(matlab編譯環境)具體安裝步驟及說明見:[MCR安裝步驟](https://blog.csdn.net/weixin_47156401/article/details/125181576?spm=1001.2014.3001.5501)
說明:D:Matlab2020aruntimewin64 、D:Matlab2020abin、D:Matlab2020apolyspacebin
這三個路徑在安裝 matlab 時系統會自動將其新增到環境變數中,所以如果電腦上未安裝 matlab
則需要去已安裝過 matlab 的電腦上找到上述四個路徑所對應的檔案,然後將其複製到該電腦,最後將其路徑新增至環境變數即可!!!
注意:設定完環境變數後需要重啟電腦,環境變數才會生效;
4、重新開啟VS2015的專案,將Matlab生成的四個檔案放入該專案所在資料夾下(已修改)
說明:需要在Project1x64Debug目錄下放入:addtest.dll、addtest.lib、
addtest.ctf,在該目錄下,上述三個檔案缺一不可,如果缺少ctf檔案,編譯不報錯,初始化會出現記憶體錯誤
並且新增標頭檔案addtest.h
5、偵錯–>視窗–>異常設定–>Win32 Exceptions全部不要勾選
#include "addtest.h" #pragma comment (lib,"addtest.lib") int main() { //初始化函數必須加 if (!addtestInitialize()) { cout << "初始化失敗!" << endl; exit(0); } else cout << "初始化成功!" << endl; mwArray a(1, 1, mxDOUBLE_CLASS); mwArray b(1, 1, mxDOUBLE_CLASS); a(1, 1) = 1.8; b(1, 1) = 2.9; mwArray z(1, 1, mxDOUBLE_CLASS); myadd(1, z, a, b); std::cout << a << "+" << b << "=" << z << std::endl; system("pause"); return 0; }
可能出現的問題:
(1)必須要進行初始化,否則mxarray會報錯。
初始化失敗可能是因為沒有把.ctf放到.dll的同級目錄下
(2)異常:0xc0000005處理
Win32 Exceptions項在vs偵錯–>視窗–>異常設定 中取消(快捷鍵Ctrl + Alt + E)
1、mwArray的寫入和讀取
網上的通用範例,來展示:
double data[4] = {1.0, 2.0, 3.0, 4.0}; double x; mwArray a(2, 2, mxDOUBLE_CLASS); a.SetData(data, 4); x = a.Get(1,1); // x = 1.0 x = a.Get(2, 1, 2); // x = 3.0 x = a.Get(2, 2, 2); // x = 4.0
解釋一下,用過matlab的同學都知道matlab預設列優先,列優先是什麼概念呢?就是資料都是按照列儲存,一列一列在記憶體上儲存的,這一點C語言也一樣。
也就是說資料是按列存入mwArray結構體,也就是說資料在記憶體裡是存成這樣的:
而我們使用時因為你指定了mwArray a(2, 2, mxDOUBLE_CLASS);嘛,你就可以認為資料就存成了這樣:
x = a.Get(2, 2, 2); // x = 4.0
實際上Get這個函數我真沒看懂,他第一個indice引數是什麼意思?指數?嘛,它不重要,真的不重要,我換成了1,2它都好使
後兩個就是索引,你看2行2列是不是4,你再看看1,1列是不是1,但是要注意,2行1列你寫成a.Get(2, 1)它真的不是2,這是因為過載函數預設第一個值是那個不明所以的indice,這就很難受。
我們再來看一個範例,來更加清晰的明白怎麼給矩陣賦初值:
int a[6] = {1,2,3,4,5,6} mwArray A(2,3,mxINT32_CLASS); A.SetData(a,6); //第二個引數為要設定的數的個數,大小可設為rows*cols
注:該過程相當於把16的矩陣,轉化為23的矩陣,matlab轉化順序是,先排第一列,由上到下為a[0] a[1],然後排第二列,由上到下為a[2] a[3],即轉化後的A為:
1 3 5 2 4 6
如果要使A為:
1 4 2 5 3 6
需這樣賦值:
int a[6] = {1,2,3,4,5,6} mwArray A(3,2,mxINT32_CLASS); //修改此處:行列數互換 A.SetData(a,6); //第二個引數為要設定的數的個數,大小可設為rows*cols
2、設定輸出
在進行函數運算時我出現了一個問題,就是我的輸出矩陣實際上是數量不確定的,目前沒有在網上找到什麼說法,然而通過實驗發現,實際上matlab在輸出時是根據實際矩陣來的,不會出現計算元素數量大於初始設定的元素數量,然後就顯示錯誤的情況。這裡進行了一個實驗證明了這個結論:
![](https://img-blog.csdnimg.cn/9114fef137684363b60a98147c742d95.png
//這裡設定了100個其實函數輸出有104個 mwArray path(100, 2, mxDOUBLE_CLASS); //如何obs為空,將obs替換為mwArray() SearchingPathPlanning(1, path, outpoint, obs, Rd); int n = path.NumberOfElements()/ path.NumberOfDimensions(); for (int i = 1; i <=n; i++) { std::cout << "a = " << path.Get(1,i,1)<< " b = " << path.Get(2,i, 2) << std::endl; }
3、注意事項
Mxarray矩陣是標籤是從1開始的,而不是傳統意義上從0開始,比如要進行輸出:
for (int i = 1; i <=7; i++)
{
std::cout << "a = " << outpoint.Get(1,i, 1) << " b = " << outpoint.Get(2,i, 2) << std::endl;
}
到此這篇關於C++呼叫matlab函數的文章就介紹到這了,更多相關C++matlab函數內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45