matlab求解多项式系数,C++和MATLAB混合编程求解多项式系数(矩阵相除)
摘要:MATLAB對(duì)于矩陣處理是非常高效的,而C++對(duì)于矩陣操作是非常麻煩的,因而可以采用C++與MATLAB混合編程求解矩陣問(wèn)題。
主要思路就是,在MATLAB中編寫(xiě)函數(shù)腳本并使用C++編譯為dll文件(在C++中可以調(diào)用編譯的函數(shù)),然后對(duì)VS項(xiàng)目進(jìn)行文件配置,編寫(xiě)C++代碼調(diào)用MATLAB中定義的函數(shù)。
問(wèn)題描述:對(duì)于一個(gè)多項(xiàng)式
需要求解c0到c5的值,由相關(guān)條件已知c0=c1=0,且
、
、
、
可得如下矩陣式:
對(duì)比類(lèi)似AX=B,可求X=A\B。
1、寫(xiě)出MATLAB代碼如下
運(yùn)行結(jié)果:
2、使用C++編譯器將ComputeC2_C5.m文件編譯成C++可以調(diào)用的.dll文件,步驟:
2.1、在MATLAB控制欄輸入"mex -setup"
2.2、點(diǎn)擊"mex -setup C++",使用C++進(jìn)行編譯
2.3、輸入"deploytool",彈出編譯(Compiler)窗口,選擇Library Compiler(庫(kù)編譯)。
2.4、進(jìn)入MATLAB Compiler窗口,按照如下步驟,1)選擇C++ Shared Library,2)點(diǎn)擊"+"號(hào)按鈕添加將要編譯的.m文件,3)填寫(xiě)Library的信息,默認(rèn)自動(dòng)填寫(xiě)腳本文件名稱(chēng),4)點(diǎn)擊Package"√"按鈕,進(jìn)行編譯打包處理。
2.5、選擇一個(gè)文件夾存放打包生成的文件,默認(rèn)和腳本文件名相同的.prj文件。
2.6、打包處理過(guò)程(大概需要幾十秒)
2.7、生成后自動(dòng)存放在與腳本同名的文件夾下,如下圖所示,第一個(gè)文件夾中的exe文件用于程序發(fā)布時(shí)用,第二個(gè)文件夾中包含相當(dāng)于release下得.h,.lib和 .dll文件,第三個(gè)文件包含測(cè)試用地.h,.lib和 .dll文件等文件,是測(cè)試需要的;至此MATLAB生成dll文件完成。
3、新建C++項(xiàng)目,并將打包生成的文件導(dǎo)入C++項(xiàng)目。
3.1、將for_testing文件夾中的.h、.lib、.dll文件復(fù)制到項(xiàng)目中并和.h、.cpp、.cu(CUDA項(xiàng)目文件)放在一起
3.2、并將.h(ComputeC2_C5.h)文件添加到項(xiàng)目中
3.3、配置電腦系統(tǒng)環(huán)境變量和VS工程屬性
1)在系統(tǒng)環(huán)境變量的Path中添加"Matlab安裝目錄\bin\win64;"
2)在項(xiàng)目屬性->配置屬性->VC++ 目錄->包含目錄,添加"Matlab安裝目錄\extern\include"
3)在項(xiàng)目屬性->配置屬性->VC++ 目錄->庫(kù)目錄,添加"Matlab安裝目錄\extern\include\lib\win64\microsoft"
4)在項(xiàng)目屬性->配置屬性->鏈接器->輸入->附加依賴(lài)項(xiàng),添加
" libmat.lib
libmex.lib
mclmcr.lib
mclmcrrt.lib
libemlrt.lib
libeng.lib
libfixedpoint.lib
libcovrt.lib "
4、編寫(xiě)代碼
代碼(.cu文件是CUDA項(xiàng)目的文件,和.cpp文件類(lèi)似,一樣可以使用):
#pragma once
#pragma comment(lib,"mclmcrrt.lib") //MATLAB中的庫(kù)文件
#pragma comment(lib,"ComputeC2_C5.lib") //必須要鏈接ComputeC2_C5.lib庫(kù)才能正常編譯運(yùn)行#include"mclcppclass.h" //使用mwArray類(lèi)的頭文件
#include "ComputeC2_C5.h" //MATLAB生成的頭文件
void ComputeC(doubleamplitude)
{if (!ComputeC2_C5Initialize())//初始化; 注意這個(gè)初始化中 !ComputeC2_C5Initialize() 字段中的 ComputeC2_C5與matlab編譯成的.lib同名
{
cout<< "Could not initialize addfunction!";
exit(0);
}
mwArray X(4, 1, mxDOUBLE_CLASS, mxREAL); //申請(qǐng)4行1列的矩陣數(shù)組
mwArray A(1, 1, mxDOUBLE_CLASS, mxREAL); //申請(qǐng)1行1列的矩陣數(shù)組
double *C2ToC5 = new double[4]; //保存X矩陣中的元素
A.SetData(&litude, 1); //設(shè)置參數(shù)
ComputeC2_C5(1, X, A); //調(diào)用函數(shù)
X.GetData(C2ToC5,4); //將函數(shù)返回值保存在C2ToC5數(shù)組中
cout <
{
cout<< "c" << i + 2 << "=" << C2ToC5[i] <
}
ComputeC2_C5Terminate();//注意結(jié)束中 !ComputeC2_C5Terminate() 字段中的 ComputeC2_C5也與matlab編譯成的.lib同名
}intmain()
{
ComputeC(10);
system("pause");return 0;
}
5、結(jié)果(上邊為VS項(xiàng)目運(yùn)行結(jié)果,下邊為MATLAB運(yùn)行結(jié)果,結(jié)果一致):
??
6、常見(jiàn)問(wèn)題:
6.1、MATLAB和VS項(xiàng)目需要位數(shù)相同,同為32位或64位。
6.2、編譯通過(guò),運(yùn)行提示"mclmcr.lib",因?yàn)橄到y(tǒng)環(huán)境變量沒(méi)有配置
6.3、編譯通過(guò),運(yùn)行不出錯(cuò)但是窗口一閃而過(guò),則是沒(méi)有設(shè)置初始化和結(jié)束語(yǔ)句。即
總結(jié)
以上是生活随笔為你收集整理的matlab求解多项式系数,C++和MATLAB混合编程求解多项式系数(矩阵相除)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: php300云,概述 · PHP300F
- 下一篇: 使用DNS 轻松获取主机信息