主要内容

从MEX函数管理外部资源

连接到外部资源(如套接字、传感器、文件和数据库)的MEX函数需要管理这些资源。因为将c++ MEX函数作为类来实现,所以可以定义构造函数和析构函数来管理这些资源和变量,这些资源和变量在对MEX函数的重复调用中持久存在。

当您称为MEX函数时,MATLAB®创建一个实例MexFunction班级。此对象仍然适用于MATLAB会话,或者直到清除对象清晰的墨西哥人命令。对MEX函数的重复调用可以在完成后处理传入数据和释放资源。

阅读文本文件

此MEX函数打开文本文件,每次调用该功能时都会读取一个单词。这MexFunction实现MEX函数的类定义了构造函数和析构函数以打开和关闭文件。每个单词读取存储在一个std :: unordered_map.确定文件中发生的次数。

构造函数

MexFunction构造函数执行以下步骤:

析构函数

类析构函数关闭文件。

函数调用算子运算符()

每个对MEX函数的调用从文本文件中读取一个单词,并将其添加到无序地图中,或者如果在地图中存在,则只会递增该单词的单词计数。MEX函数使用a使用a中显示当前单词及其计数在MATLAB命令窗口中std :: OstringStream.输出流。要解锁MEX函数,请传递一个参数(例如'开锁')到函数。

显示马铃薯

displayonmatlab.会员函数使用matlab::引擎::MATLABEngine::函数宏指令打电话给matlabFPRINGF.使用写入输出流的字符串的函数。

代码清单

#include“mex.hpp”#include“mexadapter.hpp”#include  #include 使用matlab :: mex :: grestiallist;使用命名空间matlab :: data;class mexfunction:public matlab :: mex :: function {//输入流从文件读取单词std :: ifstream infile;//无序地图以跟踪单词数量std :: unordered_map  wordcount;//指向Matlab引擎的指针std :: shared_ptr  matlabptr = getengine();//工厂创建MATLAB数据阵列ArrstFactory Factory;公共:mexfunction(){mexlock();matlabptr-> eval(u“fname = fullfile(matlabroot,'simear','matlab','sonnets.txt');”);matlab :: data :: chararray filename = matlabptr-> getvariable(U“fname”);infile.open(filename.toascii());if(!infile.is_open()){std :: OstringStream流;Stream <<“无法打开sonnets.txt”<< std :: endl;displayonmatlab(流);}}〜mexfunction(){if(infile.is_open())infile.close();void运算符()(ArgumentList输出,ArgumentList输入){if(infile.is_open()&&!infile.eof()){std :: string word; inFile >> word; wordCount[word]++; std::ostringstream stream; stream << "Read : " << "\"" << word << "\"" << ", current count: " << wordCount[word] << std::endl; displayOnMATLAB(stream); } if (!inputs.empty() || !inFile.is_open()) { mexUnlock(); } } void displayOnMATLAB(const std::ostringstream& stream){ matlabPtr->feval(u"fprintf", 0, std::vector({ factory.createScalar(stream.str()) })); } };

构建并运行sonnetWordCount.cpp

打开源代码文件,sonnetwordcount.cpp.,并使用墨西哥人命令编译MEX函数。

mex sonnetwordcount.cpp.

反复致电MEX函数以计算单词使用情况。

>> SONNETWORDCOUNT阅读:“这”, 当前的数数:1>> SONNETWORDCOUNT阅读:“十四行诗”, 当前的数数:1>> SONNETWORDCOUNT阅读:“经过”, 当前的数数:1>> SONNETWORDCOUNT阅读:“威廉”, 当前的数数:1>> SONNETWORDCOUNT阅读:“莎士比亚”, 当前的数数:1>> SONNETWORDCOUNT('开锁'

也可以看看

相关的话题