Приложения, чтобы вызвать функцию Серпинскего
Этим примером является приложение механизма, которое вызывает функцию MATLAB sierpinski
, который вычисляет точки в треугольнике Серпинскего. Пример показывает, как изменить код двигателя, чтобы запуститься с MATLAB Compiler SDK.
Если у вас есть SDK Компилятора, то можно использовать графическую функцию Серпинскего sierpinski.m в папке matlabroot/extern/examples/compilersdk/c_cpp/triangle
.
Скопируйте этот код в файл triangleEngine.cpp
.
Приложение Engine triangleEngine.cpp
/*==============================================================
*
* 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;
auto numPointsAsArray = factory.createScalar(numPoints);
auto 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 = {};
auto 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;
}
Измените код, чтобы использовать эквивалентный 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;
auto numPointsAsArray = factory.createScalar(numPoints);
auto 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 {
auto mode = mc::MATLABApplicationMode::IN_PROCESS;
std::vector<std::u16string> options = {};
auto 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;
}