C++ は MATLAB/MATLAB を呼び出して C++ を変換します

この記事は主にあなた自身の学習記録, 考えられる問題と注意事項のためのものです. 例はそれほど明確に書かれていないかもしれません. 学習と実践のための最終的な学習リファレンスリンクに詳細な例があります. わからないことがあればコメントして返信してください

テスト環境: MATLABR2019b、Visual Studio 2019、MATLABR2022b

C++ を使用して matlab 関数を変換する場合、通常は 2 つの方法を使用できます。1 つは matlab 関数を C/C++ に直接置き換える方法で、もう 1 つは関数呼び出しを使用する方法です。最初の方法には一定の制限があります. matlab に付属するすべての関数が C/C++ への直接変換をサポートしているわけではありません. コマンド実行ボックスに「help -function name」と入力すると、関数の使用法を開くことができます. 拡張関数セクションは、この関数が C/C++ コード生成の関数をサポートするかどうかを紹介します。

1. C++ が MATLAB 関数を呼び出す

テスト環境: MATLABR2019b、Visual Studio 2019

1. matlab 関数のカプセル化

matlab のコマンド実行ボックスに次のように入力します。

1. mex -setup を出力して Enter キーを押し、クリックして mex -setup C++ を選択します。

2. mbuild -setup と入力して Enter キーを押し、クリックして mex -setup C++ -client MBUILD を選択します。

3. mcc -W cpplib: localmax -T link:lib localmax.mC; と入力します。

(1) -W は、コンパイル後のパッケージ形式を制御します。

(2) cpplib は C++ にコンパイルされた lib を指します. lib を C にコンパイルする必要がある場合は、lib を使用して cpp を削除してください。

(3) cpplib の後ろのファイル名は生成する必要があるファイル名で、私が取ったもので、localmax と名付けました。

(4) -T はターゲットを示し、link:lib はライブラリ ファイルに接続するターゲットを示し、ターゲットの名前は .m 関数の名前で、localmax と名付けました。

(5) その他の特定の意味は、help –mcc コマンドで表示できます。パラメーターの大文字と小文字に注意してください。

4. コンパイルが完了すると、関数ファイル ディレクトリに関連ファイルが生成されますが、C++ で呼び出す場合は、localmax.ctf、localmax.dll、localmax.lib、localmax.h の 4 つのファイルのみが使用されます。

ここまでで、MATLAB で使用する関数ライブラリがカプセル化されました。

二、VS2019環境構成

1.VC++ディレクトリ

独自の Matlab インストール ディレクトリを見つけて、次のように構成します。プロジェクト名を右クリックし、[プロパティ] をクリックしてプロジェクト プロパティ ページを開き、構成プロパティで VC++ ディレクトリをクリックして、次の matlab ライブラリを追加します。

(1) インクルードディレクトリ: E:\work\MATLAB\MATLAB2019b\extern\include

(2) ライブラリ ディレクトリ: E:\work\MATLAB\MATLAB2019b\extern\lib\win64\microsoft

注: matlab がインストールされていない場合は、matlab がインストールされているコンピューターで上記の 2 つのパスに対応するファイルを見つけ、それをコンピューターにコピーし、最後にそのパスをインクルード ディレクトリとライブラリ ディレクトリに追加する必要があります。! !

2. リンカー -> 入力 -> 追加の依存関係で、次のライブラリを追加します。

mclmcrrt.lib、libmat.lib、libmx.lib、mclmcr.lib、localmax.lib (localmax.lib は matlab 関数をコンパイルするときに生成されるファイルで、addtest.lib は私の練習用です);

3. システム変数を構成する

[マイ コンピュータ] を右クリックし、[プロパティ] を開きます。[システムの詳細設定] を選択します。システム プロパティ ページで [詳細設定] オプションを見つけ、右下の [環境変数] を見つけます。システム変数は、ページで、次のパスを環境変数のパスに追加します。

(1) matlab がコンピューターにインストールされている場合は、次のパスを追加するだけです。

E:\work\MATLAB\MATLAB2019b\bin\win64

(2) matlab がコンピューターにインストールされていない場合は、次のパスを追加する必要があります。

注意:电脑未安装matlab是除了要添加上述路径还需要安装MCR(matlab编译环境)具体安装步骤及说明见:matlab2020a编译环境 MCR 安装步骤(非常实用)_一米九零小胖子的博客-CSDN博客_matlab mcr安装

说明:E:\work\MATLAB\MATLAB2019b\runtime\win64、E:\work\MATLAB\MATLAB2019b\bin、E:\work\MATLAB\MATLAB2019b\bin\win64,这三个路径在安装 matlab 时系统会自动将其添加到环境变量中,所以如果电脑上未安装matlab则需要去已安装过matlab的电脑上找到上述四个路径所对应的文件,然后将其复制到该电脑,最后将其路径添加至环境变量即可!!!

注意:配置完环境变量后需要重启电脑,环境变量才会生效;

4、添加相关文件

将Matlab生成的四个文件localmax.ctf、localmax.dll、localmax.lib、localmax.h放入项目所在文件夹下,不用再进行添加,放在项目文件夹下作为库函数的调用。(addtest.文件格式,是我练习用的)

5、进行调试

配置相应的输入接口数据变量,然后直接调用localmax函数即可;

注意:调用之前必须先对matlab库进行初始化操作,因此花费时间较长,不适合现实运用;

二、MATLAB转换C++

测试环境:MATLABR2022b(可支持转换c++的函数较多)、Visual Studio 2019

由于调用matlab的函数时,在未下载matlab的情况下,调用附带的文件夹太大(5G+),不满足老师要求,发现islocalmax函数在MATLABR2022b中支持转换成C++;若发现自己想实现的函数在本版本不支持转C++,可以选择更高版本的MATLAB。

现将本次调用的过程进行说明以备后续所用:

  1. 打开C++转换编译器:

本次例子采用的matlab程序:

在matlab的命令执行框内输入:Coder

也可以在APP中找到MATLAB Coder:

2、输入你要转换的.m文件名(之前已经转换过,点击overwrite将覆盖之前的信息);NEXT

3、本次转换函数输入为3*3的矩阵;点击Autodefine Input Types,将会自动给你的输入加上变量类型;NEXT

4、点击Check for Issues;检查你的程序是否有问题,若没有问题,就会出现三个对号;若有问题,需要返回看看自己编写的程序是否有问题;(注意:本次设计是对matlab自带的函数进行转换,此前在2019b上,函数帮助中介绍islocalmax函数不支持转换,操作此流程时转换成功,且没有报错,但是在VS2019上不能使用);NEXT

5、Hardware Board栏中可以选择各种硬件,如果没有满足要求的选项,选择None-select device below;Device栏按照需要进行选择,本设计为AMD芯片的win64电脑(Inetl和AMD的芯片需要区别选择)的环境;Toolchain栏选择编译工具,本项目使用VS2019进行编译;最后点击Generate生成所需代码;NEXT

6、编译成功,就此结束;

7、接下来就是文件的使用;生成的c++程序会存放在你的函数.m文件目录内codegen/lib/inverse下;

8、将上述的所有.h和.cpp文件都复制粘贴到你的vs项目下:

9、需要编写一个主函数文件(源.cpp),作为函数的输入;然后将上一步复制的文件中inverse.cpp给添加到源文件中:

9、在C++运算与matlab运算的结果进行对比:

补充注意:

应该将所有生成的.cpp和.h文件全部加入VS的源文件和头文件下才行;在转inv函数时,只加入inverse.cpp也能运行成功且结果与matlab相同;惯性思维的在转islocalmax函数时,同样操作不能运行成功,报错LINK2001和LINK2019无法解析外部符号(搞了两天,一定要脱离惯性思维),将.cpp文件和.h文件全部加入后成功运行且matlab结果一致。

学习参考链接:

Matlab转c与c++代码_on2way的博客-CSDN博客

C++调用matlab函数_plusplusfei的博客-CSDN博客

【C++&MATLAB】C++调用MATLAB(三):MATLAB库C++使用_Howie_Why的博客-CSDN博客_matlab c++

(VS)c++调用matlab函数_ZYJ_CN的博客-CSDN博客_c++调用matlab的函数

C++调用Matlab生成的DLL动态链接库进行混合编程(win10+VS2015+Matlab2016b)_青青韶华的博客-CSDN博客

おすすめ

転載: blog.csdn.net/weixin_46152123/article/details/128963601
おすすめ