matlab多项式之间相除,C++和MATLAB混合编程求解多项式系数(矩阵相除)

本文介绍了如何利用MATLAB的强大矩阵处理能力与C++进行混合编程,详细步骤包括MATLAB函数编写、C++编译为dll、VS项目配置、C++调用MATLAB函数。展示了从多项式系数求解到DLL交互的完整流程,以及常见问题及解决方法。
摘要由CSDN通过智能技术生成

摘要:MATLAB对于矩阵处理是非常高效的,而C++对于矩阵操作是非常麻烦的,因而可以采用C++与MATLAB混合编程求解矩阵问题。

主要思路就是,在MATLAB中编写函数脚本并使用C++编译为dll文件(在C++中可以调用编译的函数),然后对VS项目进行文件配置,编写C++代码调用MATLAB中定义的函数。

问题描述:对于一个多项式

84d74c811584fec7dbe419328b43a477.png

需要求解c0到c5的值,由相关条件已知c0=c1=0,且

e0e74db8ec4820a5055d811ec770b00f.png

105ce0206db246bf8b24152a35c732a0.png

eafdcbaec8ca51a97d5c8ac286e9697e.png

d3ce487cec8feee95e4c2c0b74d7a7b8.png

可得如下矩阵式:

b2f416c8b14c35f17b71cceb632fd0ed.png

对比类似AX=B,可求X=A\B。

1、写出MATLAB代码如下

9593b00db0a524b37fa9f52679dc8c88.png

运行结果:

ea3e02e61943473a50a56d8df4a4df42.png

2、使用C++编译器将ComputeC2_C5.m文件编译成C++可以调用的.dll文件,步骤:

2.1、在MATLAB控制栏输入"mex -setup"

6a6b148320584826135c67c9cc94bf9b.png

2.2、点击"mex -setup C++",使用C++进行编译

6c52ccfd6398395ec4f8b09474847cc6.png

2.3、输入"deploytool",弹出编译(Compiler)窗口,选择Library Compiler(库编译)。

3e0747c3aac77a4a29f5c3396c9c0422.png

2.4、进入MATLAB Compiler窗口,按照如下步骤,1)选择C++ Shared Library,2)点击"+"号按钮添加将要编译的.m文件,3)填写Library的信息,默认自动填写脚本文件名称,4)点击Package"√"按钮,进行编译打包处理。

7a8dac207c9edf2deddcaf7ae14d7032.png

2.5、选择一个文件夹存放打包生成的文件,默认和脚本文件名相同的.prj文件。

7bed74e94d1c03060efb0aa853b3884c.png

2.6、打包处理过程(大概需要几十秒)

c3ea33c88a5f025a3d3e8b362cc592c3.png

2.7、生成后自动存放在与脚本同名的文件夹下,如下图所示,第一个文件夹中的exe文件用于程序发布时用,第二个文件夹中包含相当于release下得.h,.lib和 .dll文件,第三个文件包含测试用地.h,.lib和 .dll文件等文件,是测试需要的;至此MATLAB生成dll文件完成。

db55fe1cb5f7cb15c23dd6b0a2192d1f.png

3、新建C++项目,并将打包生成的文件导入C++项目。

3.1、将for_testing文件夹中的.h、.lib、.dll文件复制到项目中并和.h、.cpp、.cu(CUDA项目文件)放在一起

4880bebb3066737d24c6b3b0df2d79c2.png

03257d462f983b236f5f947466139d0a.png

3.2、并将.h(ComputeC2_C5.h)文件添加到项目中

4caed6415c7ce38ea30819bae26611e3.png

9e6aac8587f3482829a6decb9a5282b7.png

2f680e96c87161d82ad21082ef7eed8b.png

3.3、配置电脑系统环境变量和VS工程属性

1)在系统环境变量的Path中添加"Matlab安装目录\bin\win64;"

a78014166978bc684230d48d31cf633c.png

2)在项目属性->配置属性->VC++ 目录->包含目录,添加"Matlab安装目录\extern\include"

b1df82d1c21aac725d125f13c471a01b.png

3)在项目属性->配置属性->VC++ 目录->库目录,添加"Matlab安装目录\extern\include\lib\win64\microsoft"

658c0d569a5a9570255aac63b7242ea5.png

4)在项目属性->配置属性->链接器->输入->附加依赖项,添加

" libmat.lib

libmex.lib

mclmcr.lib

mclmcrrt.lib

libemlrt.lib

libeng.lib

libfixedpoint.lib

libcovrt.lib "

caf893f81410b9e612f0fa8a239a8527.png

4、编写代码

01604da2f5df5c91398ab0da726ec3d2.png

代码(.cu文件是CUDA项目的文件,和.cpp文件类似,一样可以使用):

#pragma once

#pragma comment(lib,"mclmcrrt.lib") //MATLAB中的库文件

#pragma comment(lib,"ComputeC2_C5.lib") //必须要链接ComputeC2_C5.lib库才能正常编译运行#include"mclcppclass.h" //使用mwArray类的头文件

#include "ComputeC2_C5.h" //MATLAB生成的头文件

void ComputeC(doubleamplitude)

{if (!ComputeC2_C5Initialize())//初始化; 注意这个初始化中 !ComputeC2_C5Initialize() 字段中的 ComputeC2_C5与matlab编译成的.lib同名

{

cout<< "Could not initialize addfunction!";

exit(0);

}

mwArray X(4, 1, mxDOUBLE_CLASS, mxREAL); //申请4行1列的矩阵数组

mwArray A(1, 1, mxDOUBLE_CLASS, mxREAL); //申请1行1列的矩阵数组

double *C2ToC5 = new double[4]; //保存X矩阵中的元素

A.SetData(&amplitude, 1); //设置参数

ComputeC2_C5(1, X, A); //调用函数

X.GetData(C2ToC5,4); //将函数返回值保存在C2ToC5数组中

cout <

{

cout<< "c" << i + 2 << "=" << C2ToC5[i] <

}

ComputeC2_C5Terminate();//注意结束中 !ComputeC2_C5Terminate() 字段中的 ComputeC2_C5也与matlab编译成的.lib同名

}intmain()

{

ComputeC(10);

system("pause");return 0;

}

5、结果(上边为VS项目运行结果,下边为MATLAB运行结果,结果一致):

d30e2e3ea2aaeeb1369be05f4f46b51f.png   ea3e02e61943473a50a56d8df4a4df42.png

6、常见问题:

6.1、MATLAB和VS项目需要位数相同,同为32位或64位。

6.2、编译通过,运行提示"mclmcr.lib",因为系统环境变量没有配置

6.3、编译通过,运行不出错但是窗口一闪而过,则是没有设置初始化和结束语句。即

2699a8d40388cb23e79c45122ffa3458.png

7bafc97d9d35afc6da6bd824c4c933ed.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值