如何在MATALB中调用libMR


因为个人项目原因,我曾将参考OpenMax源码GitHub - abhijitbendale/OSDN: Code and data for the research paper “Towards Open Set Deep Networks” A Bendale, T Boult, CVPR 2016将其转换到MATLAB使用。

OpenMax 使用极值理论实现对开放集的筛选,在计算得分时需要用libMR 包,用于计算 weibull 概率分布。因此,训练过程中会需要fit_high() 函数用于提取右端极大值数据进行拟合,保存每一个类别拟合的MetaRecognition 对象。测试时调用预测类别 MetaRecognition 对象的CDF() 函数计算得分,获得预测样本的得分。

为了能够在 MATLAB 中实现调用 libMR ,我做出了如下操作:

  • 定义了一个句柄类 MetaRecognitionHandle,里面封装一些与 MetaRecognition
    相关的操作,主要是封装了需要使用到的函数,使得这些操作可以在 MATLAB 中以面向对象的方式调用。

  • 针对要用到的函数定义对应的 mexfunction文件,实现对 fit_high()CDF() 函数的调用。

  • MATLAB 命令行一次运行 mex XXX.cpp

为了在 MATLAB 中保存 MetaRecognition 对象,我在运行 MATLAB 代码时为每一个 MetaRecognition 对象开辟一个相应的内存空间,用于调用相应类别拟合成的对象所对应的函数。

classdef MetaRecognitionHandle < handle
    properties (Access = private)
        ObjectHandle; % 存储C++对象指针
    end
    methods
        function obj = MetaRecognitionHandle()
            obj.ObjectHandle = mexCreateMetaRecognition(); % 创建MetaRecognition对象的MEX函数
        end
        function delete(obj)
            mexDeleteMetaRecognition(obj.ObjectHandle); % 销毁MetaRecognition对象的MEX函数
        end
        function c=fitHigh(obj, tailToFit, tailSize)
            c=mexFitHigh(obj.ObjectHandle, tailToFit, tailSize); % 调用fit_high的MEX函数
        end
        function score = wScore(obj, channelDistance)
            score = mexWScore(obj.ObjectHandle, channelDistance); % 调用w_score的MEX函数
        end
    end
end

fit_high() 函数对应 mexFitHigh.cpp

#include "mex.h"
#include "MetaRecognition.h"

void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) {
    if (nrhs != 3) {
        mexErrMsgIdAndTxt("MetaRecognition:nlhs", "3 is needed.");
    }

    MetaRecognition* mr = reinterpret_cast<MetaRecognition*>(*((uint64_t*)mxGetData(prhs[0])));

    
    double* tailToFit = mxGetPr(prhs[1]);
    size_t tailSize = static_cast<size_t>(mxGetScalar(prhs[2]));
 
  
    plhs[0] = mxCreateDoubleScalar(mr->FitHigh(tailToFit, tailSize, tailSize));
}

CDF() 函数对应 mexWScore.cpp

#include "mex.h"
#include "MetaRecognition.h"

void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) {
    if (nrhs != 2) {
        mexErrMsgIdAndTxt("MetaRecognition:wScore:nrhs", "2 is need");
    }

    MetaRecognition* mr = reinterpret_cast<MetaRecognition*>(*((uint64_t*)mxGetData(prhs[0])));


    double channelDistance = mxGetScalar(prhs[1]);


    double score = mr->CDF(channelDistance);

    plhs[0] = mxCreateDoubleScalar(score);
}

mexCreateMetaRecognition.cpp

#include "mex.h"
#include "MetaRecognition.h"

void mexFunction(int nlhs, mxArray* plhs[], int nrhs, const mxArray* prhs[]) {
    MetaRecognition* mr = new MetaRecognition();
    plhs[0] = mxCreateNumericMatrix(1, 1, mxUINT64_CLASS, mxREAL);
    *((uint64_t*)mxGetData(plhs[0])) = reinterpret_cast<uint64_t>(mr);
}

mexDeleteMetaRecognition.cpp

#include "mex.h"
#include "MetaRecognition.h"

void mexFunction(int nlhs, mxArray* plhs[], int nrhs, const mxArray* prhs[]) {
    uint64_t handle = *((uint64_t*)mxGetData(prhs[0]));
    MetaRecognition* mr = reinterpret_cast<MetaRecognition*>(handle);
    delete mr;
}

调用方法

    tailToFit = sort(distance_scores, 'descend');
    tailToFit = tailToFit(1:tailsize); % 取最大的tailsize个值
    mr = MetaRecognitionHandle();
    mr.fitHigh(tailToFit, tailsize);
wScore =  categoryWeibull{3}.wScore(channelDistance);
  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 不支持直接在 MATLAB 调用 Unity3D。你可以通过编写接口来实现 MATLAB 与 Unity3D 的通信,例如,通过 MATLAB 调用 Python 脚本,然后再由 Python 脚本与 Unity3D 进行通信。 ### 回答2: 在Matlab调用Unity3D是可能的,但需要注意的是,Matlab并非专门设计用于游戏开发,而是用于数值计算和科学编程的工具。然而,通过Matlab提供的功能,可以与Unity3D进行通信和数据交换。 首先,需要在Unity3D创建一个可以与Matlab进行通信的接口。可以使用Unity3D的C#脚本编写与Matlab交互的功能。这可以通过在Unity3D项目创建一个C#脚本来实现。该脚本应该包含必要的代码来建立与Matlab的通信,并处理来自Matlab的数据。 接下来,在Matlab,你需要编写一些代码来进行与Unity3D的通信。你可以使用Matlab提供的TCP/IP通信功能来建立与Unity3D的连接,并发送/接收数据。 在Unity3D,你需要确保已经正确安装了Matlab引擎以及所需要的和插件。你可以在Unity3D的Asset Store找到适合与Matlab进行通信的插件。 一旦连接建立,你就可以在Matlab运行一些数值计算、算法分析或数据处理操作,然后将结果发送到Unity3D进行展示或进一步处理。 需要注意的是,将Matlab集成到Unity3D项目可能涉及到一些编程技巧和困难。因此,建议熟悉Unity3D和Matlab的用户尝试此操作。此外,还可以通过阅读官方文档和参考示例代码来更好地了解如何在Matlab调用Unity3D。 ### 回答3: 在Matlab调用Unity3D可以通过两种方式实现。 第一种方式是使用Unity调用Matlab Engine API。首先,在Unity创建一个C#脚本,使用Matlab引擎API来调用Matlab函数。可以使用Engine类来启动Matlab引擎,然后通过Evaluate函数执行Matlab脚本,并将计算结果返回给Unity。这种方式可以实现在Unity调用Matlab函数进行数据处理和计算。 第二种方式是使用COM组件。在Matlab,可以将需要调用的功能封装为COM组件。首先,在Matlab将要封装为COM组件的函数编写好,并且生成COM对象。然后,在Unity使用Unity的COM组件功能来调用Matlab封装好的COM组件。这种方式可以实现在Unity调用Matlab的COM组件,进行数据分析、图像处理等操作。 无论是哪种方式,在操作之前都需要确保Matlab和Unity之间的通信正常。可以在Unity引用Matlab相关的dll文件,并将其添加到Unity的工程。另外,在使用Matlab Engine API时,还需要安装Matlab Runtime环境,并设置好环境变量,以便Unity能够正确加载Matlab引擎。 总之,通过以上两种方式,我们可以在Matlab编写各种复杂的算法和计算模型,并在Unity调用这些函数来实现数据处理、图像分析、特效制作等功能。这样可以充分发挥Matlab和Unity各自的优势,实现更加强大的应用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

榴莲 蛋挞

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值