怎么我在MATLAB函数使用c++类,并使用MATLAB编码器生成代码?

47个视图(30天)
我需要使用外部类方法在MATLAB c++库函数作为我工作流程的一部分。怎么我在MATLAB函数使用c++类,并使用MATLAB编码器生成代码?

接受的答案

MathWorks支金宝app持团队
MathWorks支金宝app持团队 2015年11月12日
可以使用c++对象和方法的MATLAB代码,并使用MATLAB编码器生成代码。的基本思想是将编写一组c++函数作为类的包装方法和MATLAB编码器中调用这些包装器函数。
这个工作流程可分为3部分:
第1部分- c++源文件:
  • 定义一个空指针,将铸造的对象类型中使用MATLAB函数。这个空指针将投射到每个包装器函数对象类型。
  • 创建包装器函数类构造函数和析构函数。包装器函数的构造函数和析构函数的参数将是一个空指针转换为内部的对象类型的包装器函数。
  • 在构造函数包装器函数,在堆上分配内存。
  • 在析构函数包装器函数,使用“删除”功能来释放内存。
  • 为每一个类方法,将用于一个MATLAB函数,创建一个包装器函数。这些包装器函数的参数之一将是一个空指针。
  • 在包装器函数的方法,把空指针指向的对象类型。
  • 包装器函数内调用类方法使用箭头操作符(例如- >操作符)。
第2部分- c++头文件:
  • 创建一个包装器函数的头文件和封装的头文件的身体“外来的“C”声明以下列方式:
#如果定义__cplusplus
走读生“C”{
#endif
/ /包装器头的身体就在这里。
#如果定义__cplusplus
}
#endif
这是至关重要的,这样代码可以使用c++编译器编译和名称碾压不发生。
第3部分- MATLAB文件:
  • 使用“编码器。不透明”在MATLAB函数声明void指针类型。注意,MATLAB代码不能使用“编码器设置或访问一个变量声明。不透明”,但外部C / c++函数可以接受它作为参数。此外,一个变量声明使用“编码器。不透明的“不能被一个入口点的输出MATLAB函数。
  • 使用“编码器。eval”从第1部分中定义的调用包装器函数在MATLAB代码。
上述工作流程是强制性的能够调用MATLAB c++类的方法的代码。在c++中,一个类方法调用使用点操作符。例如,调用类的方法“mymethod”“myclass”,你会使用以下命令:
myclass.mymethod ();
“myclass。mymethod”不是一个有效的论点“编码器。在R2015b ceval”和更早的版本。因此,解决方法是编写包装器函数作为解释在上面的工作流。请参阅MATLAB编码器文档和版本说明的变化在将来的版本中。
请看附件的zip文件的一个简单的例子这个工作流c++类“人”。源文件”的人。cpp”,头文件是“person.h”。包装器函数是“personwrapper的源文件。cpp“头文件”personwrapper.h”。MATLAB函数使用包装器函数是“persontest.m”。MAT-file“configmexexe”加载2配置对象的基本工作空间;一个是用于墨西哥人文件生成,另一个是用于独立可执行的一代。“主要。cpp文件是用于执行。请参阅“generatecode MATLAB脚本。m”生成一个墨西哥人文件和可执行的。
1评论
CHV
CHV 2019年10月7日
你好,
我用MATLAB 2018 b版本和我需要调用外部c++ api在MATLAB仿真软件。金宝app我想知道是否我仍然必须遵守上述方法或新版本有更容易的方法。

登录置评。

更多的答案(2)

Geoff McVittie
Geoff McVittie 2019年6月10日
解决方案与c++交互使用标准库类和方法
std:: mem_fn ,可以在功能的c++库11和转发,自动包装类的成员方法。这允许使用c++对象被声明 coder.opque 和实例化使用 coder.ceval 。方法可以被称为功能,包装由std:: mem_fn,直接在c++对象使用编码器。ceval MATLAB代码。
例如,考虑到c++类头:
/ / myclass.h
#如果未定义MYCLASS_H
#定义MYCLASS_H
#包括< iostream >
#包括<字符串>
MyClass
{
公众:
MyClass (void) {};
int mymethod (int)
{
std:: cout < <“MyClass:: mymethod()与输入(称为“+ std:: to_string (a) +”)。”< < std:: endl;
返回42岁;
};
};
#endif
MATLAB函数可以使用类如下:
函数ret = mycode
% MYMCODE总结的这个函数
%的详细解释
coder.cinclude (<功能>的);
coder.cinclude (“myclass.h”);
p = coder.opaque (“MyClass”,“零”,“HeaderFile”,“myclass.h”);
p = coder.ceval (“MyClass”);
一个= int32 (5);
ret = coder.nullcopy (int32 (0));
ret = coder.ceval (“std:: mem_fn (myclass:: mymethod) '、p a);
结束
关于内存管理,使用C + + 14,可以扩展的例子使用智能ptr,等 std:: unique_ptr ,如下:
函数ret = mystrongmcode
% MYMCODE总结的这个函数
%的详细解释
coder.cinclude (“<记忆>”);
coder.cinclude (<功能>的);
coder.cinclude (“myclass.h”);
p = coder.opaque (“std:: unique_ptr < MyClass >”,“零”,“HeaderFile”,“myclass.h”);
p = coder.ceval (“std:: make_unique < MyClass >”);
ret = coder.nullcopy (int32 (0));
ret = coder.ceval (“std:: mem_fn (myclass:: mymethod) ',p);
结束
最后,关于开销,std:: mem_fn似乎并未引入任何开销。你可以确认这个使用任何在线编译器(如。 https://godbolt.org/ )。
9日评论
CHV
CHV 2019年11月7日
你好,
我想知道我怎样才能调用下面的方法使用编码器(str)。ceval吗?
名称空间abc {
类c {
公众:
等();
虚拟~等();
虚拟空间srt (std::向量< std:: string >);
};
}

登录置评。


Andreas Vollmayr
Andreas Vollmayr 2017年2月13日
我没有相关性的例子。
据我所见,内存管理由matlab用户必须手动完成。c++对象内存的包装器。但是,似乎没有异常处理/内存安全。它是通过基本数据类型的指针。
Mathworks能提供一个内存stl容器的安全包装的例子。谢谢你!

社区寻宝

找到宝藏在MATLAB中央,发现社区如何帮助你!

开始狩猎!