- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
目前正在想办法解决这个问题。
现在我正在尝试为 C++ 库创建 mex 函数,该库通过 Windows 10 PC 上的串行端口与微 Controller 通信,以便我可以在 matlab 中调用该库中的函数。我目前正在研究如何通过多个 matlab mexFunction 调用来保留我的类的实例。
到目前为止,我唯一能想到的就是围绕该类编写一个包装器,声明一个指向我的类实例的全局外部唯一指针,并将其包含在我的 mexFunction() 文件中。
谁能告诉我这是否可行,如果可行,matlab/C++ 究竟如何处理 mexFunction 文件及其方法调用?我不确定我的类实例的范围。
一个具体的例子可能是...
如果我在 .cpp 文件中声明一个指向对象的外部唯一指针并将其包含在我的 mexFunction 文件中,会发生什么情况?在调用多个不同的 mexFunctions 来操作该对象的 matlab 脚本中,指针是否会保持在范围内?
如果我需要重新表述问题或提供更多信息,请告诉我。
最佳答案
是的,你可以做到这一点。如果 MEX 文件都链接到同一个共享库 (DLL),那么它们都可以访问其中定义的全局变量。您需要在共享库中定义您的全局对象,而不是在 MEX 文件之一中。
MEX 文件在第一次执行后保持加载在内存中,直到您调用 clear functions
(或 clear all
)。当从内存中清除共享对象时,全局对象将被破坏。为防止意外清除您的状态,您可以使用 mexLock
锁定内存中的 MEX 文件之一。 .我建议使用一个“初始化”MEX 文件,它构造对象并将自身锁定在内存中。使用特殊参数,您可以使其解锁并销毁对象。
这是一个例子:
libXYZ.dylib
/libXYZ.so
/XYZ.dll
-- 共享库,包含 std::shared_ptr<XYZ>
.
XYZ_set.mex...
-- 初始化 XYZ
的 MEX 文件对象,并将自身锁定在内存中。链接到 libXYZ
共享库。
XYZ_get.mex...
-- 另一个链接到 libXYZ
的 MEX 文件共享库并访问 XYZ
由其他 MEX 文件创建的对象。
XYZ_lib.h
:
#include <memory>
#include <iostream>
struct XYZ {
XYZ(double a);
~XYZ();
double get();
private:
double a_;
};
extern std::unique_ptr<XYZ> XYZ_data;
XYZ_lib.cpp
:
#include "XYZ_lib.h"
std::unique_ptr<XYZ> XYZ_data;
XYZ::XYZ(double a) : a_(a) {
std::cout << "Constructing XYZ with " << a_ << '\n';
}
XYZ::~XYZ() {
std::cout << "Destructing XYZ, value was " << a_ << '\n';
}
double XYZ::get() {
return a_;
}
XYZ_set.cpp
:
#include "XYZ_lib.h"
#include <mex.h>
/// \brief An output stream buffer for MEX-files.
///
/// Creating an object of this class replaces the stream buffer in `std::cout` with the newly
/// created object. This buffer will be used as long as the object exists. When the object
/// is destroyed (which happens automatically when it goes out of scope), the original
/// stream buffer is replaced.
///
/// Create an object of this class at the beginning of any MEX-file that uses `std::cout` to
/// print information to the *MATLAB* terminal.
class streambuf : public std::streambuf {
public:
streambuf() {
stdoutbuf = std::cout.rdbuf( this );
}
~streambuf() {
std::cout.rdbuf( stdoutbuf );
}
protected:
virtual std::streamsize xsputn( const char* s, std::streamsize n ) override {
mexPrintf( "%.*s", n, s );
return n;
}
virtual int overflow( int c = EOF ) override {
if( c != EOF ) {
mexPrintf( "%.1s", &c );
}
return 1;
}
private:
std::streambuf* stdoutbuf;
};
void mexFunction( int, mxArray*[], int nrhs, const mxArray* prhs[] ) {
streambuf buf; // Allows std::cout to work in MEX-files
// Always do lots of testing for correct input in MEX-files!
if (nrhs!=1) {
mexErrMsgTxt("Requires 1 input");
}
if (mxIsChar(prhs[0])) {
// Assume it's "-unlock" or something like that. Unlock MEX-file
mexUnlock();
std::cout << "XYZ can now be cleared from memory\n";
} else {
// Here we create new data
if (!mxIsDouble(prhs[0]) || mxIsEmpty(prhs[0])) {
mexErrMsgTxt("Expected double input");
}
double a = *mxGetPr(prhs[0]);
XYZ_data = std::unique_ptr<XYZ>(new XYZ(a));
// If the MEX-file is not locked, lock it
if (!mexIsLocked()) {
mexLock();
}
}
}
(很抱歉这里的 streambuf
类,它是噪音,但我想使用它以便您可以看到正在调用的共享库中的构造函数和析构函数。)
XYZ_get.cpp
:
#include "XYZ_lib.h"
#include <mex.h>
void mexFunction( int, mxArray* plhs[], int, const mxArray* [] ) {
if (XYZ_data) {
plhs[0] = mxCreateDoubleScalar(XYZ_data->get());
} else {
mexErrMsgTxt("XYZ not initialized!");
}
}
编译:
在 shell 中(我使用的是 MacOS,因此使用 dylib
扩展名,根据需要进行调整):
g++ -std=c++11 -Wall -fpic XYZ_lib.cpp -shared -o libXYZ.dylib
在 MATLAB 中:
mex XYZ_set.cpp libXYZ.dylib
mex XYZ_get.cpp libXYZ.dylib
运行:
>> XYZ_get
Error using XYZ_get
XYZ not initialized!
>> XYZ_set(4)
Constructing XYZ with 4
>> XYZ_set(6)
Constructing XYZ with 6
Destructing XYZ, value was 4
>> XYZ_get
ans =
6
>> clear all
>> XYZ_set -unlock
XYZ can now be cleared from memory
>> clear all
Destructing XYZ, value was 6
如您所见,XYZ_get
访问对象中的值 new
编辑 XYZ_set
. clear all
通常会清除内存中的所有内容,但此处会保留锁定的 MEX 文件。 XYZ_set -unlock
使用字符串参数调用它,这会导致它自行解锁。 clear all
现在也从内存中清除该 MEX 文件,现在是 XYZ
对象被销毁。
我需要在这里提到,C++ 没有一致的 ABI,并且这些 MEX 文件只有在使用相同的编译器编译共享库时才会加载。
另一种通常更简单的方法是只创建一个 MEX 文件(与您的 C++ 代码静态链接)和一堆调用 MEX 文件的 M 文件。 M 文件提供了很好的界面(也可以进行输入检查),而 MEX 文件位于 private/
中。没有人可以弄乱它的目录。 MEX 文件仍然可以执行锁定操作,因此它可以保留在调用之间保留的对象。
关于c++ - 通过 Matlab mex 函数调用持久化 C++ 类实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48714244/
我是 python 的新手。我试图找到我的文本的频率分布。这是代码, import nltk nltk.download() import os os.getcwd() text_file=open(
我对安卓 fragment 感到困惑。我知道内存 fragment 但无法理解什么是 android fragment 问题。虽然我发现很多定义,比如 Android fragmentation re
尝试对 WordPress 进行 dockerise 我发现了这个场景: 2个数据卷容器,一个用于数据库(bbdd),另一个用于wordpress文件(wordpress): sudo docker
这个问题已经有答案了: From the server is there a way to know that my page is being loaded in an Iframe (1 个回答)
我正在玩小型服务器,试图对运行在其上的服务进行docker化。为简化起见,假设我必须主要处理:Wordpress和另一项服务。 在Docker集线器上有许多用于Wordpress的图像,但是它们似乎都
我想要发生的是,当帐户成功创建后,提交的表单应该消失,并且应该出现一条消息(取决于注册的状态)。 如果成功,他们应该会看到一个简单的“谢谢。请检查您的电子邮件。” 如果不是,那么他们应该会看到一条适当
就是这样,我需要为客户添加一个唯一标识符。通过 strip 元数据。这就是我现在完全构建它的方式,但是我只有最后一部分告诉我用户购买了哪个包。 我试着看这里: Plans to stripe 代码在这
我有一个类将执行一些复杂的操作,涉及像这样的一些计算: public class ComplexAction { public void someAction(String parameter
这个问题已经有答案了: maven add a local classes directory to module's classpath (1 个回答) 已关闭10 年前。 我有一些不应更改的旧 E
我使用 fragment 已经有一段时间了,但我经常遇到一个让我烦恼的问题。 fragment 有时会相互吸引。现在,我设法为此隔离了一个用例,它是这样的: Add fragment A(也使用 ad
我的 html 中有一个 ol 列表,上面有行条纹。看起来行条纹是从数字后面开始的。有没有办法让行条纹从数字开始? 我已经包含了正在发生的事情的片段 h4:nth-child(even) {
如何仅使用 css 将附加图像 html 化? 如果用纯 css 做不到,那我怎么能至少用一个图像来做 最佳答案 这不是真正的问题,而是您希望我们为您编写代码。我建议您搜索“css breadcrum
以下是 Joshua 的 Effective Java 的摘录: If you do synchronize your class internally, you can use various te
在这里工作时,我们有一个框向业务合作伙伴提供 XML 提要。对我们的提要的请求是通过指定查询字符串参数和值来定制的。其中一些参数是必需的,但很多不是。 例如,我们要求所有请求都指定一个 GUID 来标
我有 3 个缓冲区,其中包含在 32 位处理器上运行的 R、G、B 位数据。 我需要按以下方式组合三个字节: R[0] = 0b r1r2r3r4r5r6r7r8 G[0] = 0b g1g2g3g4
我最近发现了关于如何使用 History.js、jQuery 和 ScrollTo 通过 HTML5 History API 对网站进行 Ajax 化的要点:https://github.com/br
我们有一个 Spring Boot 应用程序,由于集成需要,它变得越来越复杂——比如在你这样做之后发送一封电子邮件,或者在你之后广播一条 jms 消息等等。在寻找一些更高级别的抽象时,我遇到了 apa
我正在尝试首次实施Google Pay。我面临如何指定gateway和gatewayMarchantId的挑战。 我所拥有的是google console帐户,不知道在哪里可以找到此信息。 priva
昨天下午 3 点左右,我为两个想要从一个 Azure 帐户转移到另一个帐户的网站设置了 awverify 记录。到当天结束时,Azure 仍然不允许我添加域,所以我赌了一把,将域和 www 子域重新指
我正在使用terms facet在elasticsearch服务器中获取顶级terms。现在,我的标签"indian-government"不被视为一个标签。将其视为"indian" "governm
我是一名优秀的程序员,十分优秀!