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


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

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

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

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

     可得如下矩阵式:

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

    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安装目录inwin64;"

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

     

     3)在项目属性->配置属性->VC++ 目录->库目录,添加"Matlab安装目录externincludelibwin64microsoft"

     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(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 << endl;
        for (int i = 0; i<4; i++)
        {
            cout << "  c" << i + 2 << " = " << C2ToC5[i] << endl;
        }
    
        ComputeC2_C5Terminate();//注意结束中 !ComputeC2_C5Terminate() 字段中的 ComputeC2_C5也与matlab编译成的.lib同名
    }
    
    
    int main()
    {
        ComputeC(10);
    
        system("pause");
        return 0;
    }

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

      

     6、常见问题:

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

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

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

     

  • 相关阅读:
    Python_Day3
    Python_Day2
    动漫推荐3.0 杂谈
    动漫推荐2.0 杂谈
    动漫推荐1.0 剧情向
    西湖十大特产
    一到春天 杭州西湖就美成了一幅画
    机械键盘十大品牌排行榜
    键盘的日常维护及清理
    无线键盘
  • 原文地址:https://www.cnblogs.com/xiaoxiaoyibu/p/11699391.html
Copyright © 2020-2023  润新知