Приложения для вызова функции Серпинского
Этот пример является приложением engine, которое вызывает функцию MATLAB sierpinski
который вычисляет точки в треугольнике Серпинского. В примере показано, как изменить код ядра для запуска с MATLAB Compiler SDK.
Если у вас есть Compiler SDK, то можно использовать графическую функцию Sierpinski sierpinski.m в matlabroot
/ extern/examples/compilersdk/c_cpp/triangle
папка.
Скопируйте этот код в файл triangleEngine.cpp
.
Прикладные triangleEngine.cpp
Engine
/*==============================================================
*
* triangleEngine.cpp
*
* MATLAB Engine API for C++ application
*============================================================*/
#include "MatlabEngine.hpp"
#include <iostream>
namespace mc = matlab::engine;
namespace md = matlab::data;
const int DEFAULT_NUMBER_OF_POINTS = 1000;
std::u16string convertAsciiToUtf16(const std::string & asciiStr);
int mainFunc(std::shared_ptr<mc::MATLABEngine> app,
const int argc, const char * argv[]) {
try {
size_t numPoints(DEFAULT_NUMBER_OF_POINTS);
if(argc > 1) {
numPoints = std::stoi(argv[1]);
}
// Create arguments as input of the MATLAB function
md::ArrayFactory factory;
matlab::data::TypedArray<size_t> numPointsAsArray = factory.createScalar(numPoints);
matlab::data::TypedArray<bool> doDrawAsArray = factory.createScalar(doDraw); // create a logical scalar
std::vector<md::Array> inputs{numPointsAsArray, doDrawAsArray};
// The Sierpinski function returns the X and Y coordinates of the points
// in the triangle. If doDraw is true, it also draws the figure.
app->feval(u"sierpinski", 2, inputs);
// Wait until the user closes the figure.
app->eval(u"figures = findobj(allchild(groot),'flat','type','figure','visible','on');
waitfor(figures(1))");
} catch(std::exception & exc) {
std::cerr << exc.what() << std::endl;
return -1;
}
return 0;
}
int main(const int argc, const char * argv[]) {
int ret = 0;
try {
std::vector<std::u16string> options = {};
std::unique_ptr<MATLABEngine> matlabApplication = mc::connectMATLAB();//startMATLAB();
ret = mainFunc(std::move(matlabApplication), argc, argv);
} catch(const std::exception & exc) {
std::cerr << exc.what() << std::endl;
return -1;
}
return ret;
}
Измените код, чтобы использовать эквивалентные значения Compiler SDK C++.
Если вы копируете следующий код в triangleSDK.cpp
и сравните файл с triangleEngine.cpp
затем можно увидеть другие изменения, относящиеся к вызову функции Серпинского.
Соответствующие развернутые прикладные triangleSDK.cpp
/*==============================================================
*
* triangleSDK.cpp
* Use the generic interface for the C++ shared library
* generated by MATLAB Compiler SDK.
*============================================================*/
#include "MatlabCppSharedLib.hpp"
#include <iomanip>
#include <iostream>
namespace mc = matlab::cpplib;
namespace md = matlab::data;
const int DEFAULT_NUMBER_OF_POINTS = 1000;
int mainFunc(std::shared_ptr<mc::MATLABApplication> app,
const int argc, const char * argv[]) {
try {
size_t numPoints(DEFAULT_NUMBER_OF_POINTS);
if(argc > 1) {
numPoints = std::stoi(argv[1]);
}
// Pass the path of the CTF (library archive file) to initMATLABL ibrary
const std::u16string U16STR_CTF_NAME = u"libtriangle.ctf";
auto lib = mc::initMATLABLibrary(app, U16STR_CTF_NAME);
// Create arguments as input of the MATLAB functio
md::ArrayFactory factory;
matlab::data::TypedArray<size_t>. numPointsAsArray = factory.createScalar(numPoints);
matlab::data::TypedArray<bool> doDrawAsArray = factory.createScalar(doDraw); // create a logical scalar
std::vector<md::Array> inputs{numPointsAsArray, doDrawAsArray};
// The Sierpinski function returns the X and Y coordinates of the points
// in the triangle. If doDraw is true, it also draws the figure.
lib->feval(u"sierpinski", 2, inputs);
// Wait until the user closes the figure.
lib->waitForFiguresToClose();
} catch(std::exception & exc) {
std::cerr << exc.what() << std::endl;
return -1;
}
return 0;
}
int main(const int argc, const char * argv[]) {
int ret = 0;
try {
matlab::cpplib::MATLABApplicationMode mode = mc::MATLABApplicationMode::IN_PROCESS;
std::vector<std::u16string> options = {};
std::shared_ptr<matlab::cpplib::MATLABApplication> matlabApplication = mc::initMATLABApplication(mode, options);
ret = mc::runMain(mainFunc, std::move(matlabApplication), argc, argv);
} catch(const std::exception & exc) {
std::cerr << exc.what() << std::endl;
return -1;
}
return ret;
}