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

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

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

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

可得如下矩阵式:

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

1、写出MATLAB代码如下

运行结果:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

" libmat.lib
libmex.lib
mclmcr.lib
mclmcrrt.lib
libemlrt.lib
libeng.lib
libfixedpoint.lib
libcovrt.lib "

4、编写代码

代码(.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(double amplitude)
{
if (!ComputeC2_C5Initialize())//初始化; 注意这个初始化中 !ComputeC2_C5Initialize() 字段中的 ComputeC2_C5与matlab编译成的.lib同名
{
cout << "Could not initialize addfunction!";
exit();
} mwArray X(, , mxDOUBLE_CLASS, mxREAL); //申请4行1列的矩阵数组
mwArray A(, , mxDOUBLE_CLASS, mxREAL); //申请1行1列的矩阵数组
double *C2ToC5 = new double[]; //保存X矩阵中的元素
A.SetData(&amplitude, ); //设置参数 ComputeC2_C5(, X, A); //调用函数 X.GetData(C2ToC5, ); //将函数返回值保存在C2ToC5数组中
cout << endl;
for (int i = ; i<; i++)
{
cout << " c" << i + << " = " << C2ToC5[i] << endl;
} ComputeC2_C5Terminate();//注意结束中 !ComputeC2_C5Terminate() 字段中的 ComputeC2_C5也与matlab编译成的.lib同名
} int main()
{
ComputeC(); system("pause");
return ;
}

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

  

6、常见问题:

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

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

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

C++和MATLAB混合编程求解多项式系数(矩阵相除)的更多相关文章

  1. VC 与Matlab混合编程之引擎操作详解

    Visual C++ 是当前主流的应用程序开发环境之一,开发环境强大,开发的程序执行速度快.但在科学计算方面函数库显得不够丰富.读取.显示数据图形不方便. Matlab 是一款将数值分析.矩阵计算.信 ...

  2. Matlab混合编程

    Matlab混合编程 混合编程目的 在Matlab中采用混合编程目的主要包括 利用已有的函数库,避免重复工作 加速计算,特别是减少循环所用时间 利用GPU等进行异构编程 混合编程方法-mex函数 目前 ...

  3. C++和MATLAB混合编程-DLL

    先小话一下DLL,DLL是动态链接库,是源代码编译后的二进制库文件和程序接口,和静态链接库不同的是,程序在编译时并不链接动态链接库的执行体,而是在文件中保留一个调用标记,在程序运行时才将动态链接库文件 ...

  4. java matlab混合编程之返回值Struct类型

    java matlab混合编程的时候当返回值是Struct类型(matlab中的返回类型)如何来取得(java中)其值? 上网找,看到这个网页:http://www.mathworks.cn/cn/h ...

  5. WPF(C#)与MATLAB混合编程

    WPF(C#)与MATLAB混合编程 WPF可以为开发者提供便捷地构建用户交互界面的解决方法,而matlab则在科学计算方面有着无与伦比的优势,因此在一些需要将科学算法转换为应用软件的项目中,需要应用 ...

  6. VS/Qt C++和Matlab混合编程

    最近两天在搞C++和Matlab混合编程,这个中间过程真是让人心酸啊,最后还是搞定成功!现在把这个过程记录一下. 首先自己的电脑本来就安装着matlab2013b,按着网上的说法首先需要输入!mcc, ...

  7. matlab混合编程向导(vc,vb,.net...)

    一.matlab与vc混编  1.通过mcc将matlab的m文件转化为cpp,c文件或dll供vc调用:     这方面的实现推荐精华区Zosco和ljw总结的方法(x-6-1-4-3-1和2)  ...

  8. C#与MATLAB混合编程

    C#和MatLab的混合编程,充分利用了winform的直观显示和matlab的强大计算能力.在此以一个小例子的形式给大家讲述一下二者混合编程的实现. 一.软件的配置说明 C#版本:VS2010 ma ...

  9. C++ 与 MATLAB 混合编程总结(14)

    1. 前言 因为毕业设计的需求,研究了一下,C++如何与MATLAB一起混合编程,中间走了一些弯路,这里总结一下. 我用的主要是C++如何调用MATLAB,而没有涉及MATLAB如何调用C++. 注意 ...

随机推荐

  1. Java动态代理 ----- jdk代理与cglib代理

    1.jdk代理 针对接口进行代理,接口可以没有方法, InvocationHandler会拦截所有方法,不过好像意义不大....只能执行Object类的方法,执行结果有点奇怪... package t ...

  2. 洛谷$P4316$ 绿豆蛙的归宿 期望

    正解:期望 解题报告: 传送门! 看懂题目还是挺水的$(bushi$ 三个方法,但因为题目太水了懒得一一介绍了,,,反正都是期望,,,$so$随便港个最简单的趴$QwQ$ 直接考虑每条边的贡献,就会是 ...

  3. JVM探秘:垃圾收集器

    本系列笔记主要基于<深入理解Java虚拟机:JVM高级特性与最佳实践 第2版>,是这本书的读书笔记. 垃圾收集器 垃圾收集算法是是内存回收的方法论,垃圾收集器是内存回收的具体实现.不同的虚 ...

  4. 浅谈Java的默认和静态方法

    目录 浅谈Java的默认和静态方法 Java新增默认方法有啥用 Java新增的静态方法有啥用 浅谈Java的默认和静态方法 允许在接口中声明默认方法和静态方法,是JDK1.8新增的特性.存在即合理,两 ...

  5. 10道java经典算法题,每一题都能帮你提升java水平!

    JAVA经典算法题 [程序1] 题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第四个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少? 1.程序分析:   ...

  6. GPL协议中国第一案尘埃落定,相关开源软件应如何风控?

    导读:2019年11月6日,数字天堂(北京)网络技术有限公司(以下简称 “数字天堂公司”)诉柚子(北京)科技有限公司.柚子(北京)移动技术有限公司(以下简称 “柚子公司”)侵犯计算机软件著作权纠纷一案 ...

  7. Android系统启动过程分析

    Android系统启动过程分析 一.Android平台架构 首先贴一张Android系统架构图方便理解整个Android架构,这可以让我们从整体上对整个启动流程有个大概认知. 可以看出整个架构由5部分 ...

  8. Linux环境下详细讲解部署MySQL5.7版本

    说明: 在本人写作这篇安装MySQL文章时,虽然MySQL已经发布到8.0.17版本,但对于行业来说,主力版本依然是5.7版本.目前在Linux环境默认安装时,大部分已经默认安装到8版本了,所以本人特 ...

  9. rest实践3

    1.从mongodb的数据实体Document中获取其中一个字段的值,即例如:doc.getString("pid"),直接显示value. 2.当从网络上的网址url的图片直接弄 ...

  10. Jaeger容器化部署

    概述 Jaeger是由Uber开源的分布式追踪系统,一套完整的Jager追踪系统包括Jaeger-client.Jaeger-agent.Jaeger-collector.Database和Jaege ...