连接到外部资源(如套接字、传感器、文件和数据库)的MEX函数需要管理这些资源。因为将c++ MEX函数作为类来实现,所以可以定义构造函数和析构函数来管理这些资源和变量,这些资源和变量在对MEX函数的重复调用中持久存在。
当您称为MEX函数时,MATLAB®创建一个实例MexFunction
班级。此对象仍然适用于MATLAB会话,或者直到清除对象清晰的
墨西哥人
命令。对MEX函数的重复调用可以在完成后处理传入数据和释放资源。
此MEX函数打开文本文件,每次调用该功能时都会读取一个单词。这MexFunction
实现MEX函数的类定义了构造函数和析构函数以打开和关闭文件。每个单词读取存储在一个std :: unordered_map.
确定文件中发生的次数。
这MexFunction
构造函数执行以下步骤:
称呼MEXLOCK.
防止从内存中清除MEX函数。
从Matlab获取文本文件的完整路径matlab::引擎::MATLABEngine:: eval和Matlab :: Engine :: Matlabengine :: GetVariable。
打开文本文件std :: ifstream
输入流。
类析构函数关闭文件。
每个对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.
,并使用墨西哥人
命令编译MEX函数。
mex sonnetwordcount.cpp.
反复致电MEX函数以计算单词使用情况。
>> SONNETWORDCOUNT阅读:“这”, 当前的数数:1>> SONNETWORDCOUNT阅读:“十四行诗”, 当前的数数:1>> SONNETWORDCOUNT阅读:“经过”, 当前的数数:1>> SONNETWORDCOUNT阅读:“威廉”, 当前的数数:1>> SONNETWORDCOUNT阅读:“莎士比亚”, 当前的数数:1>> SONNETWORDCOUNT('开锁')