matlab的exec程序,C++调用Matlab画图的一段程序
勞動(dòng)節(jié)閑來無事,寫了一天程序,just for fun.
看,這是C++調(diào)用Matlab畫圖的一段程序。暫時(shí)不想多解釋了,有興趣的話,看看下面的代碼吧。
以下幾段代碼由上到下,越來越舊。最上面的是最新更新的版本。#include#include#include#include#includeusing?namespace?std;
#include#include#includeclass?MatArray
{
public:
MatArray()?:?_data(NULL){}
MatArray(size_t?irows,?size_t?icols){
resize(irows,?icols);
}
MatArray(const?MatArray?&obj){
if?(obj._data){
_data?=?mxCreateDoubleMatrix(obj.rows(),?obj.cols(),?mxREAL);
memcpy(this->ptr(),?obj.ptr(),?sizeof(double)*rows()*cols());
}
else{
_data?=?NULL;
}
}
~MatArray(){?mxDestroyArray(_data);?_data?=?NULL;?}
inline?size_t?rows()?const?{?return?_data???mxGetM(_data)?:?0;?}
inline?size_t?cols()?const?{?return?_data???mxGetN(_data)?:?0;?}
inline?double*?ptr()?const?{?return?_data???mxGetPr(_data)?:?NULL;?}
bool?resize(size_t?irows,?size_t?icols){
if?(!_data){
_data?=?mxCreateDoubleMatrix(irows,?icols,?mxREAL);
return?(_data?!=?NULL);
}
if?(rows()?==?irows?||?cols()?==?icols){
return?true;
}
mxDestroyArray(_data);
_data?=?mxCreateDoubleMatrix(irows,?icols,?mxREAL);
return?(_data?!=?NULL);
}
int?put(Engine?*ep,?const?char*?var_name){
return?engPutVariable(ep,?var_name,?_data);
}
templatevoid?copy_from_eigen(const?EigenMat?&emat){
if?(emat.rows()*emat.cols()?==?0){
mxDestroyArray(_data);?_data?=?NULL;
}
resize(emat.rows(),?emat.cols());
for?(int?c?=?0;?c?
for?(int?r?=?0;?r?
(*this)[r?+?c*(int)(emat.rows())]?=?emat(r,?c);
}
}
}
inline?double&?operator[](int?i){
return?ptr()[i];
}
private:
mxArray?*_data;
};
string?rndcolor(){
string?color?=?"[";
color?+=?to_string((rand()?%?256)?/?255.)?+?",";
color?+=?to_string((rand()?%?256)?/?255.)?+?",";
color?+=?to_string((rand()?%?256)?/?255.)?+?"]";
return?color;
}
class?Matlab
{
private:
Matlab(const?Matlab?&obj){}
public:
Matlab(){
_engine?=?engOpen(NULL);
if?(!_engine){
cerr?<
}
else{
cout?<
}
}
~Matlab(){
//?if?you?are?testing?algorithm,?you?are?encouraged?to?keep?the?line?below?bing?committed.
//engClose(_engine);?_engine?=?NULL;
}
//?line_spec?:?"LineStyle"?+?"Marker"?+?"Color",?e.g.?"-or"
//?for?line
//?"LineStyle"?=?{"none",?"-",?":",?"-."}
//?"LineWidth"?=?0.5
//?"Color"?=?{[0?0.4470?0.7410]?(default)?|?RGB?triplet?|?{y,m,c,r,g,b,w,k}?|?'none'}
//?for?Marker
//?"Marker"?=?{"none",?"o",?"+",?"*",?".",?"x",?"s",?"d",?"^",?"v",?">",?"
//?"MarkerEdgeColor"?=?'auto'?(default)?|?'none'?|?RGB?triplet?|?{y,m,c,r,g,b,w,k}
//?"MarkerFaceColor"?=?'auto'?(default)?|?'none'?|?RGB?triplet?|?{y,m,c,r,g,b,w,k}
//?"MarkerSize"?=?6
templateint?plot(const?TMatX?&X,?const?TMatY?&Y,
string?nm0??=?"",
string?nm1??=?"",?string?nm2??=?"",
string?nm3??=?"",?string?nm4??=?"",
string?nm5??=?"",?string?nm6??=?"",
string?nm7??=?"",?string?nm8??=?"",
string?nm9??=?"",?string?nm10?=?"",
string?nm11?=?"",?string?nm12?=?"",
string?nm13?=?"",?string?nm14?=?""
){
MatArray?MX,?MY;
MX.copy_from_eigen(X);?MX.put(_engine,?"MX");
MY.copy_from_eigen(Y);?MY.put(_engine,?"MY");
string?plot_code?=?"MX,?MY";
string?code;
#define?EVL_CODE(_ARG0,_ARG1)?code?=?var_plot_code(nm##_ARG0,?nm##_ARG1);?if(code?!=?""){?plot_code?+=?",?"?+?code;}
code?=?var_plot_code(nm0,?"");
if?(code?!=?""){
plot_code?+=?",?"?+?code;
EVL_CODE(1,?2);
EVL_CODE(3,?4);
EVL_CODE(5,?6);
EVL_CODE(7,?8);
EVL_CODE(9,?10);
EVL_CODE(11,?12);
EVL_CODE(13,?14);
}
else{
EVL_CODE(0,?1);
EVL_CODE(2,?3);
EVL_CODE(4,?5);
EVL_CODE(6,?7);
EVL_CODE(8,?9);
EVL_CODE(10,?11);
EVL_CODE(12,?13);
}
#undef?EVL_CODE
plot_code?=?"plot("?+?plot_code?+?");";
cout?<
exec(plot_code);
return?0;
}
//?line_spec?:?"LineStyle"?+?"Marker"?+?"Color",?e.g.?"-or"
//?for?line
//?"LineStyle"?=?{"none",?"-",?":",?"-."}
//?"LineWidth"?=?0.5
//?"Color"?=?{[0?0.4470?0.7410]?(default)?|?RGB?triplet?|?{y,m,c,r,g,b,w,k}?|?'none'}
//?for?Marker
//?"Marker"?=?{"none",?"o",?"+",?"*",?".",?"x",?"s",?"d",?"^",?"v",?">",?"
//?"MarkerEdgeColor"?=?'auto'?(default)?|?'none'?|?RGB?triplet?|?{y,m,c,r,g,b,w,k}
//?"MarkerFaceColor"?=?'auto'?(default)?|?'none'?|?RGB?triplet?|?{y,m,c,r,g,b,w,k}
//?"MarkerSize"?=?6
templateint?plot_mask(const?TMatX?&X,?const?TMatY?&Y,?const?TMask?&mask,
string?nm0??=?"",
string?nm1??=?"",?string?nm2??=?"",
string?nm3??=?"",?string?nm4??=?"",
string?nm5??=?"",?string?nm6??=?"",
string?nm7??=?"",?string?nm8??=?"",
string?nm9??=?"",?string?nm10?=?"",
string?nm11?=?"",?string?nm12?=?"",
string?nm13?=?"",?string?nm14?=?""
){
MatArray?MX,?MY,?MS;
MX.copy_from_eigen(X);?MX.put(_engine,?"MX");
MY.copy_from_eigen(Y);?MY.put(_engine,?"MY");
MS.copy_from_eigen(mask);?MS.put(_engine,?"MS");
string?plot_code?=?"MX(MS>0),?MY(MS>0)";
string?code;
#define?EVL_CODE(_ARG0,_ARG1)?code?=?var_plot_code(nm##_ARG0,?nm##_ARG1);?if(code?!=?""){?plot_code?+=?",?"?+?code;}
code?=?var_plot_code(nm0,?"");
if?(code?!=?""){
plot_code?+=?",?"?+?code;
EVL_CODE(1,?2);
EVL_CODE(3,?4);
EVL_CODE(5,?6);
EVL_CODE(7,?8);
EVL_CODE(9,?10);
EVL_CODE(11,?12);
EVL_CODE(13,?14);
}
else{
EVL_CODE(0,?1);
EVL_CODE(2,?3);
EVL_CODE(4,?5);
EVL_CODE(6,?7);
EVL_CODE(8,?9);
EVL_CODE(10,?11);
EVL_CODE(12,?13);
}
#undef?EVL_CODE
plot_code?=?"plot("?+?plot_code?+?");";
cout?<
exec(plot_code);
return?0;
}
string?var_plot_code(string?nm,?string?var){
boost::trim(nm);?boost::trim(var);
if?(nm?==?""){
return?"";
}
string?code?=?"'"?+?nm?+?"'";
if?(var?==?""){
return?(nm[0]??'Z')???code?:?"";
}
if?(nm?==?"LineStyle"?||?nm?==?"Marker"){?//?string
//?'LineStyle',?'-'
return?code?+?",?'"?+?var?+?"'";
}
if?(nm?==?"LineWidth"?||?nm?==?"MarkerSize"){?//?positive?number
//?'LineWidth',?0.5
return?code?+?",??"?+?var;
}
if?(nm?==?"Color"?||?nm?==?"MarkerEdgeColor"?||?nm?==?"MarkerFaceColor"){
if?(var[0]?==?'['){
return?code?+?",??"?+?var;
}
else{
return?code?+?",?'"?+?var?+?"'";
}
}
return?"";
}
int?exec(string?cmd){
return?engEvalString(_engine,?cmd.c_str());
}
private:
Engine?*_engine;
};
Matlab?mbeng;
int?main(int?argc,?char**?argv){
//?random?circles
Eigen::ArrayXXf?data;
data?=?data.Random(1000,?2);
//mbeng.exec("figure(1);?clf;");
mbeng.plot(data.col(0),?data.col(1),?"o",?"MarkerFaceColor",?"[0,0,0]",?"MarkerEdgeColor",?"[0,0,0]");
mbeng.exec("axis?tight;");
//?different?colors
int?K?=?4;
Eigen::ArrayXXi?clid;
clid?=?Eigen::abs(clid.Random(1000,?1));
for?(int?i?=?0;?i?
clid(i,?0)?=?clid(i,?0)?%?K;
}
mbeng.exec("figure(2);?clf;");
for?(int?k?=?0;?k?
string?colors?=?rndcolor();
mbeng.plot_mask(data.col(0),?data.col(1),?(clid?==?k),?"o",?"MarkerFaceColor",?colors,?"MarkerEdgeColor",?colors,?"MarkerSize",?"5");
mbeng.exec("hold?on;");
}
mbeng.exec("hold?off;");
mbeng.exec("axis?tight;");
//?plot?line
Eigen::ArrayXf?X;
Eigen::ArrayXf?Y;
X?=?X.LinSpaced(30,-3.1415926f,?3.1415926f);
Y?=?X.sin()*X.cos();
mbeng.exec("figure(3);");
mbeng.plot(X,?Y,?"LineStyle",?"-.",?"Marker",?"o",?"MarkerSize",?"5",?"MarkerFaceColor",?"[0,1,0]");
mbeng.exec("axis?tight;");
return?EXIT_SUCCESS;
}
#include#include#include#include#includeusing?namespace?std;
#include#includeclass?MatArray
{
public:
MatArray()?:?_data(NULL){}
MatArray(size_t?irows,?size_t?icols){
resize(irows,?icols);
}
MatArray(const?MatArray?&obj){
if?(obj._data){
_data?=?mxCreateDoubleMatrix(obj.rows(),?obj.cols(),?mxREAL);
memcpy(this->ptr(),?obj.ptr(),?sizeof(double)*rows()*cols());
}
else{
_data?=?NULL;
}
}
~MatArray(){?mxDestroyArray(_data);?_data?=?NULL;?}
inline?size_t?rows()?const?{?return?_data???mxGetM(_data)?:?0;?}
inline?size_t?cols()?const?{?return?_data???mxGetN(_data)?:?0;?}
inline?double*?ptr()?const?{?return?_data???mxGetPr(_data)?:?NULL;?}
bool?resize(size_t?irows,?size_t?icols){
if?(!_data){
_data?=?mxCreateDoubleMatrix(irows,?icols,?mxREAL);
return?(_data?!=?NULL);
}
if?(rows()?==?irows?||?cols()?==?icols){
return?true;
}
mxDestroyArray(_data);
_data?=?mxCreateDoubleMatrix(irows,?icols,?mxREAL);
return?(_data?!=?NULL);
}
int?put(Engine?*ep,?const?char*?var_name){
return?engPutVariable(ep,?var_name,?_data);
}
templatevoid?copy_from_eigen(const?EigenMat?&emat){
if?(emat.rows()*emat.cols()?==?0){
mxDestroyArray(_data);?_data?=?NULL;
}
resize(emat.rows(),?emat.cols());
for?(int?c?=?0;?c?
for?(int?r?=?0;?r?
(*this)[r?+?c*(int)(emat.rows())]?=?emat(r,?c);
}
}
}
inline?double&?operator[](int?i){
return?ptr()[i];
}
private:
mxArray?*_data;
};
string?rndcolor(){
string?color?=?"[";
color?+=?to_string((rand()?%?256)?/?255.)?+?",";
color?+=?to_string((rand()?%?256)?/?255.)?+?",";
color?+=?to_string((rand()?%?256)?/?255.)?+?"]";
return?color;
}
class?Matlab
{
private:
Matlab(const?Matlab?&obj){}
public:
Matlab(){
_engine?=?engOpen(NULL);
if?(!_engine){
cerr?<
}
else{
cout?<
}
}
~Matlab(){
//?if?you?are?testing?algorithm,?you?are?encouraged?to?keep?the?line?below?bing?committed.
//engClose(_engine);?_engine?=?NULL;
}
templateint?plot(const?TMatX?&X,?const?TMatY?&Y,?string?line_spec?=?"",?int?figure_id?=?1,?bool?hold_on?=?false){
MatArray?MX,?MY,?ID;
MX.copy_from_eigen(X);?MX.put(_engine,?"MX");
MY.copy_from_eigen(Y);?MY.put(_engine,?"MY");
ID.resize(1,?1);?ID[0]?=?figure_id;?ID.put(_engine,?"ID");
string?plot_code?=?"?figure(ID);?plot(MX,?MY";
if?(line_spec?!=?""){
plot_code?=?plot_code?+?","?+?line_spec;
}
plot_code?+=?");";
plot_code?+=?hold_on???"hold?on;"?:?"hold?off;";
return?engEvalString(_engine,?plot_code.c_str());
}
templateint?plot(const?TMatX?&X,?const?TMatY?&Y,?const?TMatC?&C,?int?K,?int?figure_id?=?1,?int?marker_size?=?5,?string?line_and_marker?=?"o"){
MatArray?MX,?MY,?MC,?ID;
MX.copy_from_eigen(X);?MX.put(_engine,?"MX");
MY.copy_from_eigen(Y);?MY.put(_engine,?"MY");
MC.copy_from_eigen(C);?MC.put(_engine,?"MC");
ID.resize(1,?1);?ID[0]?=?figure_id;?ID.put(_engine,?"ID");
exec("figure(ID);?clf;");
for?(int?k?=?0;?k?
string?rdc?=?rndcolor();
exec(string("idx?=?MC==")?+?to_string(k)?+?";");
exec("plot(MX(idx),?MY(idx),?'"?+?line_and_marker?+?"',?'MarkerEdgeColor',?"?+?rdc?+?",'MarkerFaceColor',"?+?rdc?+?",?'MarkerSize',"?+?to_string(marker_size)?+?");?hold?on;");
}
exec("hold?off;");
return?0;
}
templateint?plot(const?TMatX?&X,?const?TMatY?&Y,?int?figure_id?=?1,?int?marker_size?=?5,?string?line_and_marker?=?"-"){
MatArray?MX,?MY,?ID;
MX.copy_from_eigen(X);?MX.put(_engine,?"MX");
MY.copy_from_eigen(Y);?MY.put(_engine,?"MY");
ID.resize(1,?1);?ID[0]?=?figure_id;?ID.put(_engine,?"ID");
string?rdc?=?rndcolor();
exec("figure(ID);?clf;");
exec("plot(MX,?MY,?'"?+?line_and_marker?+?"',?'MarkerEdgeColor',?"?+?rdc?+?",'MarkerFaceColor',"?+?rdc?+?",?'MarkerSize',"?+?to_string(marker_size)?+?");?hold?on;");
exec("hold?off;");
return?0;
}
int?exec(string?cmd){
return?engEvalString(_engine,?cmd.c_str());
}
private:
Engine?*_engine;
};
#if?1
int?main(int?argc,?char**?argv){
Matlab?mbeng;
//?random?circles
Eigen::ArrayXXf?data;
data?=?data.Random(1000,?2);
mbeng.plot(data.col(0),?data.col(1),?1,?5,?"o");
mbeng.exec("axis?tight;");
//?different?colors
int?K?=?4;
Eigen::ArrayXXi?clid;
clid?=?Eigen::abs(clid.Random(1000,?1));
for?(int?i?=?0;?i?
clid(i,0)?=?clid(i,0)?%?K;
}
mbeng.plot(data.col(0),?data.col(1),?clid,?K,?2);
mbeng.exec("axis?tight;");
//?plot?line
Eigen::ArrayXXf?X(1000,1);
Eigen::ArrayXXf?Y(1000,1);
float?fpi?=?3.1415926f;
float?sstep?=?fpi*2?/?1000.f;
for?(int?i?=?0;?i?
X(i,?0)?=?-3.1415926f?+?i*sstep;
Y(i,?0)?=?sin(X(i,0))*cos(X(i,0));
}
mbeng.plot(X,?Y,?3,?5,?"?-?");
mbeng.exec("axis?tight;");
return?EXIT_SUCCESS;
}
#endif
跑一下:
#include#include#include#include#include#includeusing?namespace?std;
#include#includeclass?MatArray
{
public:
MatArray()?:?_data(NULL){}
MatArray(size_t?irows,?size_t?icols){
resize(irows,?icols);
}
MatArray(const?MatArray?&obj){
if?(obj._data){
_data?=?mxCreateDoubleMatrix(obj.rows(),?obj.cols(),?mxREAL);
memcpy(this->ptr(),?obj.ptr(),?sizeof(double)*rows()*cols());
}
else{
_data?=?NULL;
}
}
~MatArray(){?mxDestroyArray(_data);?_data?=?NULL;?}
inline?size_t?rows()?const?{?return?_data??mxGetM(_data):0;?}
inline?size_t?cols()?const?{?return?_data??mxGetN(_data):0;?}
inline?double*?ptr()?const?{?return?_data??mxGetPr(_data):NULL;?}
bool?resize(size_t?irows,?size_t?icols){
if?(!_data){
_data?=?mxCreateDoubleMatrix(irows,?icols,?mxREAL);
return?(_data?!=?NULL);
}
if?(rows()?==?irows?||?cols()?==?icols){
return?true;
}
mxDestroyArray(_data);
_data?=?mxCreateDoubleMatrix(irows,?icols,?mxREAL);
return?(_data?!=?NULL);
}
int?put(Engine?*ep,?const?char*?var_name){
return?engPutVariable(ep,?var_name,?_data);
}
templatevoid?copy_from_eigen(const?EigenMat?&emat){
if?(emat.rows()*emat.cols()?==?0){
mxDestroyArray(_data);?_data?=?NULL;
}
resize(emat.rows(),?emat.cols());
for?(int?c?=?0;?c?
for?(int?r?=?0;?r?
(*this)[r?+?c*emat.rows()]?=?emat(r,?c);
}
}
}
inline?double&?operator[](int?i){
return?ptr()[i];
}
private:
mxArray?*_data;
};
class?Matlab
{
private:
Matlab(const?Matlab?&obj){}
public:
Matlab(){
_engine?=?engOpen(NULL);
if?(!_engine){
cerr?<
}
else{
cout?<
}
}
~Matlab(){
//?if?you?are?testing?algorithm,?you?are?encouraged?to?keep?the?line?below?bing?committed.
//engClose(_engine);?_engine?=?NULL;
}
templateint?plot(const?TMatX?&X,?const?TMatY?&Y,?string?line_spec?=?"",?int?figure_id?=?1,?bool?hold_on?=?false){
MatArray?MX,?MY,?ID;
MX.copy_from_eigen(X);?MX.put(_engine,?"MX");
MY.copy_from_eigen(Y);?MY.put(_engine,?"MY");
ID.resize(1,?1);?ID[0]?=?figure_id;?ID.put(_engine,?"ID");
string?plot_code?=?"?figure(ID);?plot(MX,?MY";
if?(line_spec?!=?""){
plot_code?=?plot_code?+?","?+?line_spec;
}
plot_code?+=?");";
plot_code?+=?hold_on???"hold?on;"?:?"hold?off;";
return?engEvalString(_engine,?plot_code.c_str());
}
int?exec(string?cmd){
return?engEvalString(_engine,?cmd.c_str());
}
private:
Engine?*_engine;
};
string?rndcolor(){
string?color?=?"[";
color?+=?to_string((rand()?%?256)?/?255.)?+?",";
color?+=?to_string((rand()?%?256)?/?255.)?+?",";
color?+=?to_string((rand()?%?256)?/?255.)?+?"]";
return?color;
}
int?main(int?argc,?char**?argv){
Eigen::MatrixXf?data;
srand((unsigned?int)time(0));
data?=?data.Random(1000,?2);
Matlab?mateng;
//mateng.exec("clear?all;?close?all;");
mateng.plot(data.col(0),?data.col(1),?string("'s',")?+?"'MarkerEdgeColor',"?+?rndcolor()?+?",'MarkerFaceColor',"?+?rndcolor()?+?",?'MarkerSize',?5",?1,?true);
return?EXIT_SUCCESS;
}
執(zhí)行一下!看看結(jié)果!
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的matlab的exec程序,C++调用Matlab画图的一段程序的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 魔兽世界工会名字195个
- 下一篇: c语言sort函数排序二维数组,c++