matlab调用C++接口

项目中遇到了一个情况,需要使用matlab来调用C++一个动态库,整理如下:

一、基本调用

1. 需要安装mingw编译器

2. matlab去编译一个C++的包装函数(转接函数)

3. 包装函数(转接函数)里面去调用真正需要调用的C++逻辑

参开代码:

mex编译

mex('package.cpp', ...
    'CXXFLAGS -std=c++17',...
    '-g',...
    '-IF:\include',...         % 需要包含的头文件路径
    '-lopencv_world422d',...   % 需要使用的库路径
    );

C++实现:

#include "Test.h"
#include "mex.h"
#include <iostream>
#include <string.h>
void mexPackFun(int nlhs, mxArray* plhs[], int nrhs, const mxArray* prhs[])
{
    // 具体的C++逻辑
}

2. 使用结构体传参

项目中如果希望直接将matlab的结构体传给C++接口,怎么处理?

matlab代码

clc;clear all;close all;
stu(1).name='aa';
stu(1).length=100;
stu(1).pix_dis=0.005;
DscFunction(stu);

C++适配代码

#include "mex.h"
#include "DscNew.h"
#include<cstdio>
#include <memory>

void mexFunction(int nlhs, mxArray* plhs[], int nrhs, mxArray* prhs[])
{
	std::shared_ptr<DSCNew> sp_dsc_new = std::make_shared<DSCNew>("");
    
    if (mxIsStruct(prhs[0]))
	{
		mxArray* str_name = mxGetField(prhs[0], i, "name");
        if (str_name)
        {
            char* tmp = mxArrayToString(str_name);//convert mxArray to string
        }
		mxArray* length_ = mxGetField(prhs[0], i, "length");
		if (length_)
		{
			auto length = *(length_);
		}
	}
}

3. 参数类型为matlab::mex::ArgumentList

    void operator()(matlab::mex::ArgumentList outputs, matlab::mex::ArgumentList inputs)
    {
        //ArrayFactory factory;
        StructArray matlabStructArray = inputs[0];
        auto fields                   = matlabStructArray.getFieldNames();
        std::vector<std::string> fieldNames(fields.begin(), fields.end());
        matlab::data::TypedArrayRef<double> field1Reference = matlabStructArray[0][fieldNames[0]];
        double field1Reference_v = field1Reference[0];
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值