C/C++调用matlab

C/C++调用matlab

matlab虽然可以生成C/C++的程序,但其能力很有限,很多操作无法生成C/C++程序,比如函数求解、优化、拟合等。为了解决这个问题,可以采用matlab和C/C++联合编程的方式进行。使用matlab将关键操作打包成dll环境,再由C/C++调用。

所需环境

  1. windows11
  2. matlab2018a
  3. VsStudio2017、VsStudio2022

matlab生成dll

  1. 编写待测试的matlab函数“test1”
function y = test1(a,b)
    %TEST1 此处显示有关此函数的摘要
    %   此处显示详细说明
    x=fminunc(@(x)x^2+4*x+5,1);
    
    y = cos(a) + b^2 + 3 + x;
end
  1. 使用matlab命令“mex -setup”设置MEX,点击选择“mex -setup C++”;
  2. 使用matlab命令“mbuild -setup”设置MBUILD,点击选择“mex -setup C++ -client MBUILD ”;
  3. 使用matlab命令“mcc -B csharedlib:test1 test1.m”,等待生成所需的问题;
    生成的主要文件有:“test1.h”、“test1.lib”、“test1.dll”

C/C++调用dll

  1. 编写main.cpp
#include "test1.h"

#include 

#pragma comment (lib,"test1.lib")

using namespace std;

int main() {
	cout << "Hello CMake." << endl;

	// 初始化,必不可少
	if (!test1Initialize()) {
		std::cout << "failed to initialize test1" << std::endl;
		return -1;
	}

	mxArray* a = mxCreateDoubleMatrix(1, 1, mxREAL);
	double aSNR[] = { -1 };
	memcpy(mxGetPr(a), (void*)aSNR, sizeof(aSNR));
	mxArray* b = mxCreateDoubleMatrix(1, 1, mxREAL);
	double SNR[] = { 1 };
	memcpy(mxGetPr(b), (void*)SNR, sizeof(SNR));
	mxArray* c = mxCreateDoubleMatrix(1, 1, mxREAL);
	mxArray** y = &c;
	mlfTest1(1, y, a, b);
	double* dataPtr = mxGetPr(*y);
	cout << "res: " << dataPtr[0] << endl;

	test1Terminate();

	cout << "end" << endl;

	return 0;
}
  1. 编写CMakeLists.txt
cmake_minimum_required (VERSION 3.8)

project ("C_Matlab")

include_directories(
	C:\\tools\\matlab\\extern\\include    #改成本地matlab的安装位置
)

link_directories(
	.\\
	C:\\tools\\matlab\\extern\\lib\\win64\\microsoft    #改成本地matlab的安装位置
)

# 将源代码添加到此项目的可执行文件。
add_executable (test0 "main.cpp"
)
target_link_libraries(test0
    test1
    mclmcrrt
)
  1. 将文件“test1.h”和"test1.lib"放到CMakeList.txt文件所在的文件夹下;
  2. 使用VSstudio2022打开CMakeList.txt文件所在的文件夹,并进行编译;
  3. 将文件“test1.dll”放到可执行文件“test0”所在的目录下;
  4. 运行可执行程序“test0”。

异常处理

mex -setup异常


图1

通常,只需要按照VSstudio2017即可。

应用程序处于中断模式

C/C++调用matlab_第1张图片
图2

点击“调试”、“窗口”,选择“异常设置”,取消“Win32 Exceptions”的点选模式

C/C++调用matlab_第2张图片
图3

你可能感兴趣的:(matlab,C/C++,联合编程)