最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++調(diào)用matlab函數(shù)的實(shí)例

 更新時(shí)間:2022年08月25日 14:19:17   作者:plusplusfei  
這篇文章主要介紹了C++調(diào)用matlab函數(shù)的方法,包括封裝matlab函數(shù),編譯matlab函數(shù)及C++環(huán)境配置,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下

一、封裝matlab函數(shù)

首先把matlab代碼封裝成函數(shù)形式,下面舉一個(gè)例子,myadd是主函數(shù):

function c = myadd(a, b)
c  =ADD(a, b);
end
function A = ADD(a, b)
c  = a + b;
end

二、 編譯matlab函數(shù)

具體編譯步驟為:
1、輸出mex -setup 回車,然后點(diǎn)擊選擇 mex -setup C++;

2、輸入mbuild -setup 回車,然后點(diǎn)擊選擇 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 后面的是需要生成文件的文件名,是自己取的,我們?nèi)∶麨?addtest;
(4)-T表示目標(biāo),link:lib表示要連接到一個(gè)庫(kù)文件的目標(biāo),目標(biāo)的名字即是.m函數(shù)的名字;
(5)其他具體含義可以通過mcc –help命令查看,注意參數(shù)的大小寫
4、編譯完成后會(huì)生成:addtest.ctf、addtest.dll、addtest.lib、addtest.h、
addtest.cpp、addtest.def、addtest.exp、addtest.exports 等四個(gè)文件,但是在C++ 調(diào)用時(shí)只用到了前四個(gè):

三 、C++環(huán)境配置

說明:創(chuàng)建工程文件,注意:測(cè)試環(huán)境使用的是64位操作系統(tǒng),因此務(wù)必在x64環(huán)境下進(jìn)行以下配置。(這是與你的matlab版本匹配的,我的matlab安裝的是64bit的)
1、C++目錄
找到自己 Matlab 的安裝目錄按照以下進(jìn)行配置;
(1)包含目錄:D:\Matlab2020a\extern\include
(2)庫(kù)目錄:D:\Matlab2020a\extern\lib\win64\microsoft
說明:如果未安裝matlab,則需要去已安裝過 matlab 的電腦上找到上述兩個(gè)路徑所對(duì)應(yīng)的文件
然后將其復(fù)制到該電腦,最后將其路徑添加至包含目錄和庫(kù)目錄即可?。?!

2、鏈接器->輸入->附加依賴項(xiàng),添加以下庫(kù)

mclmcrrt.lib、libmat.lib、libmx.lib、mclmcr.lib、addtest.lib(編譯 matlab 函數(shù)時(shí)生成的文件);

3、配置系統(tǒng)變量(已修改)

“我的電腦”右鍵,打開“屬性”;選擇“高級(jí)系統(tǒng)設(shè)置”;找到系統(tǒng)屬性頁面的“高級(jí)”選項(xiàng),右下方

“環(huán)境變量”;頁面中下方是系統(tǒng)變量,將如下路徑添加到環(huán)境變量的Path中:
(1)如果電腦上裝的有 matlab 則僅需要添加如下路徑:

    D:\Matlab2020a\bin\win64

(2)如果電腦上沒有安裝 matlab 則需要添加如下路徑:

    劃重點(diǎn):電腦未安裝matlab是除了要添加上述路徑還需要安裝MCR(matlab編譯環(huán)境)具體安裝步驟及說明見:[MCR安裝步驟](https://blog.csdn.net/weixin_47156401/article/details/125181576?spm=1001.2014.3001.5501)

說明:D:\Matlab2020a\runtime\win64 、D:\Matlab2020a\bin、D:\Matlab2020a\polyspace\bin
這三個(gè)路徑在安裝 matlab 時(shí)系統(tǒng)會(huì)自動(dòng)將其添加到環(huán)境變量中,所以如果電腦上未安裝 matlab
則需要去已安裝過 matlab 的電腦上找到上述四個(gè)路徑所對(duì)應(yīng)的文件,然后將其復(fù)制到該電腦,最后將其路徑添加至環(huán)境變量即可?。?!
注意:配置完環(huán)境變量后需要重啟電腦,環(huán)境變量才會(huì)生效;

4、重新打開VS2015的項(xiàng)目,將Matlab生成的四個(gè)文件放入該項(xiàng)目所在文件夾下(已修改)
說明:需要在Project1\x64\Debug目錄下放入:addtest.dll、addtest.lib、
addtest.ctf,在該目錄下,上述三個(gè)文件缺一不可,如果缺少ctf文件,編譯不報(bào)錯(cuò),初始化會(huì)出現(xiàn)內(nèi)存錯(cuò)誤
并且添加頭文件addtest.h
5、調(diào)試–>窗口–>異常設(shè)置–>Win32 Exceptions全部不要勾選

#include "addtest.h"
#pragma comment (lib,"addtest.lib")
int main()
{
		//初始化函數(shù)必須加
	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;
}

可能出現(xiàn)的問題:
(1)必須要進(jìn)行初始化,否則mxarray會(huì)報(bào)錯(cuò)。
初始化失敗可能是因?yàn)闆]有把.ctf放到.dll的同級(jí)目錄下
(2)異常:0xc0000005處理
Win32 Exceptions項(xiàng)在vs調(diào)試–>窗口–>異常設(shè)置 中取消(快捷鍵Ctrl + Alt + E)

四、mwArray數(shù)組的運(yùn)用

1、mwArray的寫入和讀取

網(wǎng)上的通用示例,來展示:

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的同學(xué)都知道m(xù)atlab默認(rèn)列優(yōu)先,列優(yōu)先是什么概念呢?就是數(shù)據(jù)都是按照列儲(chǔ)存,一列一列在內(nèi)存上存儲(chǔ)的,這一點(diǎn)C語言也一樣。
也就是說數(shù)據(jù)是按列存入mwArray結(jié)構(gòu)體,也就是說數(shù)據(jù)在內(nèi)存里是存成這樣的:

803a95758a2dfc4b591b056723bc79f8.png

而我們使用時(shí)因?yàn)槟阒付薽wArray a(2, 2, mxDOUBLE_CLASS);嘛,你就可以認(rèn)為數(shù)據(jù)就存成了這樣:

b519b5fcc7ceac249a005937b0e9049e.png

x = a.Get(2, 2, 2); // x = 4.0

實(shí)際上Get這個(gè)函數(shù)我真沒看懂,他第一個(gè)indice參數(shù)是什么意思?指數(shù)?嘛,它不重要,真的不重要,我換成了1,2它都好使
后兩個(gè)就是索引,你看2行2列是不是4,你再看看1,1列是不是1,但是要注意,2行1列你寫成a.Get(2, 1)它真的不是2,這是因?yàn)橹剌d函數(shù)默認(rèn)第一個(gè)值是那個(gè)不明所以的indice,這就很難受。
我們?cè)賮砜匆粋€(gè)示例,來更加清晰的明白怎么給矩陣賦初值:

int a[6] = {1,2,3,4,5,6}  
mwArray A(2,3,mxINT32_CLASS);    
A.SetData(a,6); //第二個(gè)參數(shù)為要設(shè)置的數(shù)的個(gè)數(shù),大小可設(shè)為rows*cols

注:該過程相當(dāng)于把16的矩陣,轉(zhuǎn)化為23的矩陣,matlab轉(zhuǎn)化順序是,先排第一列,由上到下為a[0] a[1],然后排第二列,由上到下為a[2] a[3],即轉(zhuǎn)化后的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);  //修改此處:行列數(shù)互換  
A.SetData(a,6); //第二個(gè)參數(shù)為要設(shè)置的數(shù)的個(gè)數(shù),大小可設(shè)為rows*cols

2、設(shè)置輸出

在進(jìn)行函數(shù)運(yùn)算時(shí)我出現(xiàn)了一個(gè)問題,就是我的輸出矩陣實(shí)際上是數(shù)量不確定的,目前沒有在網(wǎng)上找到什么說法,然而通過實(shí)驗(yàn)發(fā)現(xiàn),實(shí)際上matlab在輸出時(shí)是根據(jù)實(shí)際矩陣來的,不會(huì)出現(xiàn)計(jì)算元素?cái)?shù)量大于初始設(shè)置的元素?cái)?shù)量,然后就顯示錯(cuò)誤的情況。這里進(jìn)行了一個(gè)實(shí)驗(yàn)證明了這個(gè)結(jié)論:
![](https://img-blog.csdnimg.cn/9114fef137684363b60a98147c742d95.png

//這里設(shè)置了100個(gè)其實(shí)函數(shù)輸出有104個(gè)
	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、注意事項(xiàng)

Mxarray矩陣是標(biāo)簽是從1開始的,而不是傳統(tǒng)意義上從0開始,比如要進(jìn)行輸出:

for (int i = 1; i <=7; i++)
{
std::cout << "a = " << outpoint.Get(1,i, 1) << " b = " << outpoint.Get(2,i, 2) << std::endl;
}

到此這篇關(guān)于C++調(diào)用matlab函數(shù)的文章就介紹到這了,更多相關(guān)C++matlab函數(shù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 使用C語言實(shí)現(xiàn)內(nèi)存池的示例代碼

    使用C語言實(shí)現(xiàn)內(nèi)存池的示例代碼

    所謂內(nèi)存池,顧名思義和線程池的設(shè)計(jì)原理是一樣的,為了減少頻繁申請(qǐng)釋放內(nèi)存而帶來的資源消耗,減少釋放內(nèi)存后產(chǎn)生的內(nèi)存碎片,下面我們就來看看如何使用C語言實(shí)現(xiàn)內(nèi)存池吧
    2024-02-02
  • Qt獲取git版本信息的具體方法

    Qt獲取git版本信息的具體方法

    這篇文章主要介紹了Qt獲取git版本信息的具體方法,今天又碰到這個(gè)問題了,想根據(jù)具體的git版本信息做代碼問題確認(rèn),文中有詳細(xì)的解決方案,具有一定的參考價(jià)值,需要的朋友可以參考下
    2024-04-04
  • 《C++ primer plus》讀書筆記(一)

    《C++ primer plus》讀書筆記(一)

    本讀書筆記是C++ primer plus(第六版)前3章的學(xué)習(xí)筆記。非常的淺顯易懂,復(fù)習(xí)C++基礎(chǔ)知識(shí)的可以瞄瞄。
    2014-10-10
  • C++的optional用法實(shí)例詳解

    C++的optional用法實(shí)例詳解

    編程中我們可能會(huì)遇到要處理可能為空的變量,比如說容器,基本類型,或者說對(duì)象實(shí)例,下面通過實(shí)例代碼介紹C++的optional用法,感興趣的朋友一起看看吧
    2024-02-02
  • C++常量指針,指針常量,指向常量的常指針詳解

    C++常量指針,指針常量,指向常量的常指針詳解

    剛接觸到指針時(shí),關(guān)于C++常量指針,指針常量,指向常量的常指針容易混淆,所以整理下,希望能夠幫助自己也幫助到大家
    2021-10-10
  • C++中的作用域案例詳解

    C++中的作用域案例詳解

    作用域規(guī)定了標(biāo)識(shí)符在代碼中的可見性和可訪問性,全局作用域中的標(biāo)識(shí)符可以在整個(gè)程序中使用,局部作用域中的標(biāo)識(shí)符只能在其所在的代碼塊中使用,而命名空間作用域提供了一種組織和封裝代碼的方式,以避免命名沖突,這篇文章主要介紹了C++中的作用域,需要的朋友可以參考下
    2024-02-02
  • Qt設(shè)置窗體(QWidget)透明度的方法總結(jié)

    Qt設(shè)置窗體(QWidget)透明度的方法總結(jié)

    在Qt開發(fā)中,有的時(shí)候需要為窗體設(shè)置透明度。這篇文章主要為大家介紹幾個(gè)Qt中窗體設(shè)置透明度的方法,文中的示例代碼講解詳細(xì),需要的可以參考一下
    2022-11-11
  • 一文詳解如何在VS?Code上搭建C/C++開發(fā)環(huán)境

    一文詳解如何在VS?Code上搭建C/C++開發(fā)環(huán)境

    VSCode是由微軟開發(fā)的一款免費(fèi)、開源、跨平臺(tái)的文本編輯器,它具有許多強(qiáng)大的功能,這篇文章主要給大家介紹了關(guān)于如何在VS?Code上搭建C/C++開發(fā)環(huán)境的相關(guān)資料,文中通過圖文介紹的非常詳細(xì),需要的朋友可以參考下
    2024-03-03
  • C語言實(shí)現(xiàn)房屋管理系統(tǒng)

    C語言實(shí)現(xiàn)房屋管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)房屋管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-12-12
  • C語言簡(jiǎn)明分析選擇結(jié)構(gòu)和循環(huán)結(jié)構(gòu)的使用

    C語言簡(jiǎn)明分析選擇結(jié)構(gòu)和循環(huán)結(jié)構(gòu)的使用

    C語言條件控制語句選擇結(jié)構(gòu),是屬于計(jì)算機(jī)的語言編輯,有在C語言條件控制中的語句選擇結(jié)構(gòu)的存在,即是C語言條件控制語句選擇結(jié)構(gòu),循環(huán)控制語句是一個(gè)基于C語言的編程語句,該語句主要有while循環(huán)語句、do-while循環(huán)語句和for循環(huán)語句來實(shí)現(xiàn)循環(huán)結(jié)構(gòu)
    2022-04-04

最新評(píng)論

蕲春县| 孟州市| 杭锦旗| 大竹县| 红河县| 鄂温| 文安县| 东山县| 土默特左旗| 普陀区| 灵武市| 鹤山市| 东平县| 东兰县| 沈阳市| 德州市| 南郑县| 杂多县| 郎溪县| 张掖市| 虎林市| 雅安市| 理塘县| 彭阳县| 玉树县| 司法| 封开县| 比如县| 岳普湖县| 云梦县| 郑州市| 崇州市| 确山县| 桂东县| 东乡县| 廉江市| 鲁山县| 枞阳县| 巨鹿县| 抚顺县| 华亭县|