📄 curvefit.c
字号:
// curvefit.c 曲线拟合
#include <conio.h>
#include "engine.h"
#include "mutil.h"
#define BUFFERLEN 1024
mxArray *CalculateFcn(mxArray *x,mxArray *y)
{
Engine *ep;
mxArray *equation;
char flag[1],buffer[BUFFERLEN];
int status;
ep=engOpen(NULL);
if(ep==(Engine*)NULL)
fprintf(stderr,"ERR:Cannot Open MATLAB Engine! \n");
fprintf(stdout,"计算引擎MATLAB是可见的......\n");
fprintf(stdout,"隐藏计算引擎,按任意键继续......\n");
getch();
status=engSetVisible(ep,false);
if(status!=0)
{
fprintf(stderr,"错误: 无法隐藏计算引擎!\n");
return(NULL);
}
fprintf(stdout,"进行数据处理计算......\n");
//将数据传输到MATLAB工作空间
status=engPutVariable(ep,"x",x);
if(status!=0)
{
fprintf(stderr,"错误: 无法将数据传输到MATLAB工作空间!\n");
return(NULL);
}
status=engPutVariable(ep,"y",y);
if(status!=0)
{
fprintf(stderr,"错误: 无法将数据传输到MATLAB工作空间!\n");
return(NULL);
}
//设置输出缓存区
engOutputBuffer(ep,buffer,BUFFERLEN);
//执行多项式拟合
status=engEvalString(ep,"k5=polyfit(x,y,5);y5=polyval(k5,x);");
if(status!=0)
{
fprintf(stderr,"错误: 无法运行MATLAB命令!\n");
fprintf(stderr,"%s\n",buffer);
return(NULL);
}
engEvalString(ep,"subplot(2,1,1),plot(x,y,'b',x,y5,'r');");
engEvalString(ep,"xlabel('x');ylabel('y');title('x VS y');axis tight;");
engEvalString(ep,"legend('Original','Fitted');");
engEvalString(ep,"subplot(2,1,2),bar(x,y-y5,'r');");
engEvalString(ep,"xlabel('x');ylabel('y');title('Residuals');axis tight;");
//获取计算结果
equation=engGetVariable(ep,"k5");
fprintf(stdout,"Done!\n");
fprintf(stdout,"按任意键继续......\n");
getch();
//关闭计算引擎
status=engClose(ep);
if(status!=0)
{
fprintf(stderr,"错误: 无法关闭MATLAB计算引擎!\n");
return(NULL);
}
return(equation);
}
//////////主函数///////////
void main()
{
mxArray *xdata,*ydata,*eqn;
//从数据文件curvedata.mat中获取变量x&y
xdata=ReadArray("curvedata.mat","x");
ydata=ReadArray("curvedata.mat","y");
//多项式拟合计算,同时绘图
eqn=CalculateFcn(xdata,ydata);
//将计算结果保存到curvedata.mat中
//WriteArray("curvedata.mat","k5",eqn);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -