这就是一篇matlab软件自学之路的记录,能帮助到大家非常荣幸!!!主要还是感谢开发了myfigure函数的博主啦!!!
目录
前言
我本来是做一个simulink仿真,输入信号是一个论文里面得出的结论(一条二次函数抛物线),我想用它Library里面Signal Builder来拟合曲线,无奈它的import输入方式是通过外部导入excel表格里面各个点,我不可能一个个输入100个数据点,所以萌生了先用matlab中plot命令画出图像,再由图像导出excel数据点。
困难的地方就在plot图像转化为excel数据点,幸好我找到了这一篇文章,里面博主搭建了一个myfigure函数,帮助我完成了这一步。非常感谢这位博主的无私分享。
这篇文章:https://blog.csdn.net/ywsydwsbn/article/details/125323700
改进代码
copy了此博主的代码却出现了报错,主要是有的function没有用end来结尾。所以我去查了一下function和if语句的用法,重新检查更新了一下code,代码如下:
%% 我的曲线方程
x=linspace(0,2,100);
y=-0.056*x.^2+0.521*x+0.048;
figure,plot(x,y,'r')
xlabel('时间');
ylabel('速度');
title('抛物线速度曲线');
axis([0,2,0,1]);
myfigure
%% 博主的曲线方程
% x=linspace(0,2*pi,100);
% y1=sin(x);y2=cos(x);
% figure,plot(x,y1,'r.-',x,y2,'b*')
% xlabel('x'),ylabel('y')
% myfigure
%% myfigure代码
function myfigure
%L X, 2014.01
f=gcf;
h=findobj(f,'Label','数据输出');
if isempty(h)
hm1=uimenu('Parent',f,'Label','数据输出');
uimenu(hm1,'Label','查看数据','callback',@Read_data);
uimenu(hm1,'Label','输出至txt','callback',@Save_Strain);
uimenu(hm1,'Label','输出至excel','callback',@Opexcel);
uimenu(hm1,'Label','输出至WP','callback',@OpWP);
hm2=uimenu('Parent',f,'Label','坐标范围');
uimenu(hm2,'Label','X坐标','callback',@X_lim);
uimenu(hm2,'Label','Y坐标','callback',@Y_lim);
end
end
function Save_Strain(~,~)
h_Line=get(gca,'Children');
Xdata=cell2mat(get(h_Line,{'Xdata'}));
Ydata=cell2mat(get(h_Line,{'Ydata'}));
Ydata=flipud(Ydata);
Data=[Xdata;Ydata];
L=size(Data,1);
formt=repmat('%f ',[1,L]);
%assignin('base','Data',Data')
[filename,pathname]=uiputfile('*.txt');
if ~isequal(filename,0)
fid=fopen([pathname,filename],'w');
fprintf(fid,[formt,'\r\n'],Data);
a=fclose(fid);
end
if a==0
end
h=helpdlg('保存成功');
pause(0.5)
close(h)
end
function Opexcel(~,~)
h_Line=get(gca,'Children');
Xdata=cell2mat(get(h_Line,{'Xdata'}));
Ydata=cell2mat(get(h_Line,{'Ydata'}));
Ydata=flipud(Ydata);
Data=[Xdata;Ydata];
[filename,pathname]=uiputfile('*.xls');
if ~isequal(filename,0)
xlswrite([pathname,filename],Data');
end
h=helpdlg('保存成功');
pause(0.5)
close(h)
end
function OpWP(~,~)
h_Line=get(gca,'Children');
Xdata=cell2mat(get(h_Line,{'Xdata'}));
Ydata=cell2mat(get(h_Line,{'Ydata'}));
Ydata=flipud(Ydata);
Data=[Xdata;Ydata];
assignin('base','Data',Data')
h=helpdlg('已输出至Matlab工作空间!');
pause(0.5)
close(h)
end
function Read_data(~,~)
Xdata=cell2mat(get(gco,{'Xdata'}));
Ydata=cell2mat(get(gco,{'Ydata'}));
Xdata=Xdata';
Ydata=Ydata';
data=[Xdata,Ydata];
f=figure('NumberTitle','off','Menubar','none');
uitable('Parent',f,'Data',data);
end
function X_lim(~,~)
prompt={'起始值','终止值'};
dlg_title='请输入参数';
num_lines=1;
def = {'0','10'};
siz=inputdlg(prompt,dlg_title,num_lines,def);
if ~isempty(siz)
siz1=str2double(siz{1});
siz2=str2double(siz{2});
xlim([siz1 siz2])
end
end
function Y_lim(~,~)
prompt={'起始值','终止值'};
dlg_title='请输入参数';
num_lines=1;
def = {'0','10'};
siz=inputdlg(prompt,dlg_title,num_lines,def);
if ~isempty(siz)
siz1=str2double(siz{1});
siz2=str2double(siz{2});
ylim([siz1 siz2])
end
end
----------这是一条分割线----------
演示结果
运行之后的界面是这样的:
可以看出多了“数据输出”、“坐标范围”。我们所要的数据点就可以通过点击数据输出,创建一个excel表格,导出为xls格式。
Signal Builder导入excel数据后如下图:
完美!!!