开发区域

高级软件开发与MATLAB

MATLAB c++

大家好!今天我想介绍一位客座博主Vivek Bhownani,他是R2019a中一个令人兴奋的新特性的首席开发人员,该特性可以轻松访问c++库,而无需编写任何c++代码。把它拿走,Vivek…

有一个c++库,你使用或想在MATLAB中使用?我们总是听到用户希望调用c++库的请求,这些库涉及从机器学习到游戏开发的各个主题。OpenCV、Tensorflow和LibXL就是一些例子。

包装一个c++库以供外部环境使用是一项非常耗时的任务,需要大量的开发工作。我们的目标是使您能够在不编写任何c++代码的情况下调用c++,从而可能将包装库的工作从几天缩短到几个小时。

多年来,MATLAB提供了调用这些库的能力,方法是将它们封装在C接口中并使用LOADLIBRARY。MATLAB还提供了MEX接口,允许您编写MATLAB包装器文件调用C或c++功能。然而,每个选项都有其局限性,并且都没有提供从MATLAB直接调用c++的方法。这就是为什么我对R2019a中帮助您从MATLAB调用c++库的新功能感到兴奋的原因。MATLAB现在讲c++ !

我们的用户角色我想通过这篇文章接触到两种不同类型的用户。你是一个出版商如果你想在MATLAB中调用某个c++库。你是一个最终用户如果您只是想通过已发布的接口来调用库。

内容

你不需要知道c++就可以调用c++

我们希望帮助发布者专注于基于您的c++库构建应用程序。事实上,你甚至不需要知道太多c++。让我们来做吧。

SWIG是一个工具,它提供了一种为c++库发布包装器接口的方法,这些包装器接口可以从Python和Java等环境中使用。但是用户需要编写特殊的SWIG接口代码,他们必须学习和维护这些代码。与SWIG不同,MATLAB将尝试为您生成一个接口定义文件。然后,您可以在指定的块中编辑此文件,以根据您的需要定制接口。你不需要学习特定的编码方法。

作为最终用户,您甚至不需要创建接口文件—也许有人会为您编写一个。

我们鼓励一些人作为发布者,为希望与最终用户共享的库创建这些接口文件。您可能是一个编写c++库的开发人员,并希望获得更广泛的受众;或者您的公司提供了可以与MATLAB一起使用的硬件驱动程序。其他发布者可能只是想分享他们的工作,以帮助其他用户调用您正在调用的c++库。作为发布者,您需要一个兼容的c++编译器。如果您是终端用户,则不需要c++编译器来调用库。

让我们看看调用我编写的c++类

我用c++为一个Car with Engine的例子创建了两个类:

class Engine {private: int fnumberofcylinder;public: Engine(int numcylinder): fnumberofcylinder (numcylinder), isserved (false) {} int getnumcylinder () const {return fnumberofcylinder;} bool isServiced;};class Car {private: Engine& fEngine;public: Car(Engine &engine): fEngine(Engine) {} Engine& getEngine() {return fEngine;}};

建筑界面

由于这个库只是一个头文件,我们可以使用以下函数进行“直接”构建:

clibgen.generateLibraryDefinition (“auto.h”);构建(defineauto);
警告:仅指定头文件;假设这是一个头文件库。如果还需要指定库文件,请使用'Libraries'选项。警告:文件的清单。json的没有找到。使用Microsoft Visual c++ 2015编译器。生成的定义文件'C:\BlogPost\defineauto。mlx'和数据文件'C:\BlogPost\autoData.xml'包含MATLAB支持的9个构造的定义。金宝app构建使用构建(defineauto)。构建接口文件'autoInterface.dll'。接口文件'autoInterface.dll'内置在文件夹'C:\BlogPost\auto'。 To use the library, add the interface file folder to the MATLAB path.

您可以安全地忽略在这种情况下生成的警告。我们发出一个警告来提醒用户,我们假设这是一个仅头文件库,如果这是不准确的,那么应该使用“Libraries”选项来提供库。不要忘记将生成的文件夹'auto'(包含生成的接口)添加到MATLAB路径中。

目录“汽车”);

就这样,我们现在准备从MATLAB调用这个库

让我们首先创建一辆有引擎的汽车

eng = clib.auto.Engine (4);车= clib.auto.Car (eng);car.getEngine.isServiced
逻辑0

现在让我们修理一下引擎,再检查一下车子:

eng。isServiced = true;car.getEngine.isServiced
逻辑1

MATLAB创建句柄来表示c++对象。如上所述,'eng'指向汽车内部的引擎(由'car'类中的'getEngine'方法返回的对象)。然而,它不能用来破坏汽车内部的引擎,也就是说,汽车继续拥有它的引擎。注意,当我们在引擎上调用delete时。

删除eng (eng)
eng =删除引擎句柄
car.getEngine这辆汽车(及其引擎)仍然完好无损。。
ans =带有属性的引擎

现在让我们看一个加密示例

下面是一段c++代码,它调用SpaceCrypto库中的加密算法来加密字符串“hello world!”,然后调用decrypt以获取原始字符串。

#include  #include "cryptopp_wrapper.h" using namespace std;int main(){//调用加密cout<<"Space Wrapper TEST!"<
           

建筑界面

这里我们需要比上一个例子做更多的工作,但我们仍然不需要编写c++代码。我们有另一种方法来构建接口,这是一个多步骤的过程——生成定义文件,提供定义,然后构建。

设置环境

loc =“cryptopp700”;dllLoc = fullfile (loc,“x64 \ DLL_Output \释放”);路径= getenv (“路径”);setenv (“路径”, (dllLoc“;”路径]);

生成的定义

headerFiles =“cryptopp_wrapper.h”;includePath = loc;outputFolder = pwd;库= [fullfile (loc,“x64 \ DLL_Output \ \ cryptopp.lib发布”),...fullfile (loc,“x64 \ DLL_Output \ \ cryptlib.lib发布”));clibgen.generateLibraryDefinition (headerFiles“IncludePath”includePath,...“库”、图书馆、“OutputFolder”outputFolder,“PackageName”“密码”“详细”,真正的);
警告:头文件中的一些c++语言结构不受支持,也不被导入。金宝app使用Microsoft Visual c++ 2015编译器。生成的定义文件'C:\BlogPost\definecrypto。mlx'和数据文件'C:\BlogPost\cryptoData.xml'包含MATLAB支持的20个构造的定义。金宝app构念需要额外的定义。要在接口中包含这些构造,请编辑'C:\BlogPost\definecrypto.mlx'中的定义。构建使用构建(definecrypto)。

上面的步骤生成定义文件。它列出了头文件中读取的所有类、函数、枚举等。

定义文件…我为什么需要它?

构建c++接口的大部分工作流程都是自动化的。MATLAB读取提供的头文件并生成一个接口库,该接口库提供了调用库中的每个函数/类的方法。然而,在某些情况下,我们不能自动调用这些函数,我们需要发布者来帮助指定“如何调用”这些函数(点击这里为例)。下面是生成文件的片段:

如果要调用的函数没有完全定义,则提供它们的定义。使用c++代码(如上所示)来理解需要定义哪些函数。

现在通过调用:

构建(definecrypto)
构建接口文件'cryptoInterface.dll'。接口文件'cryptoInterface.dll'内置在文件夹'C:\BlogPost\crypto'。要使用该库,请将接口文件文件夹添加到MATLAB路径中。

请注意:您需要一个与构建库所用的编译器兼容的c++编译器。

现在我们可以调用MATLAB中的库了。更重要的是,我们有一个发布者可以与最终用户共享的接口,他们不需要编译器,也不需要知道任何c++调用库。在MATLAB中调用这个c++库就像调用任何其他的MATLAB代码一样。

进口SpaceCrypto图书馆

目录“密码”) loc =“cryptopp700”;dllLoc = fullfile (loc,“x64 \ DLL_Output \释放”);路径= getenv (“路径”);setenv (“路径”, (dllLoc“;”路径]);进口clib.crypto。*

加密原始消息

cryptObj = SpaceCrypto.CryptBlowFish;cryptObj.setPlainString (“MATLAB c++说话!”);使用MATLAB字符串cryptObj.setKey (“mySecUreKey ! !”);encryptedMessage = cryptObj.Encrypt ()
encryptedMessage = " 3540541 c31806edd0fed2ad653a9b1ead224d192aa281b26 "

解密并检索原始消息

cryptObj = SpaceCrypto.CryptBlowFish;cryptObj.setEncString (encryptedMessage);cryptObj.setInputMode (SpaceCrypto.OUT_TYPE.HEX);% MATLAB枚举为c++枚举cryptObj.setKey (“mySecUreKey ! !”);cryptObj.setOutputMode (SpaceCrypto.OUT_TYPE.NORMAL);originalMessage = cryptObj。解密
originalMessage = "MATLAB Speaks c++ !"

尝试接口到你自己的c++库

使用上面描述的步骤包装要在MATLAB中调用的c++库。阅读我们的文档要学习更多的知识。在19a中,我们支持金宝app大量c++ 98构造,如函数、类、方法、模板实例化和类型定义。在未来,我们将提供对std::vector、智能指针、宽字符串等金宝app的支持。我们还计划在MATLAB中支持c金宝app++对象的自动内存管理。我们会继续改进这个功能,我想听听你的意见。请在下方评论,并告诉我们你是如何进行的,或者你认为接下来我们应该添加哪些功能。我们才刚刚开始!




发布与MATLAB®R2019a

|

评论

要留下评论,请点击在这里登录到您的MathWorks帐户或创建一个新帐户。