在matlab中用定时器在x轴上绘图

在matlab中用定时器在x轴上绘图,matlab,matlab-guide,Matlab,Matlab Guide,我有一个Matlab代码,它根据循环迭代绘制变量值 在这个例子中,我将随机值视为变量值 function varargout = myplot(varargin) gui_Singleton = 1; gui_State = struct('gui_Name', mfilename, ... 'gui_Singleton', gui_Singleton, ... 'gui_OpeningFcn', @my

我有一个Matlab代码,它根据循环迭代绘制变量值

在这个例子中,我将随机值视为变量值

function varargout = myplot(varargin)

gui_Singleton = 1;
gui_State = struct('gui_Name',       mfilename, ...
                   'gui_Singleton',  gui_Singleton, ...
                   'gui_OpeningFcn', @myplot_OpeningFcn, ...
                   'gui_OutputFcn',  @myplot_OutputFcn, ...
                   'gui_LayoutFcn',  [] , ...
                   'gui_Callback',   []);
if nargin && ischar(varargin{1})
    gui_State.gui_Callback = str2func(varargin{1});
end

if nargout
    [varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
else
    gui_mainfcn(gui_State, varargin{:});
end
% End initialization code - DO NOT EDIT


% --- Executes just before myplot is made visible.
function myplot_OpeningFcn(hObject, eventdata, handles, varargin)

handles.output = hObject;
% Update handles structure
guidata(hObject, handles);


function varargout = myplot_OutputFcn(hObject, eventdata, handles) 

varargout{1} = handles.output;


% --- Executes on button press in pushbutton1.
function pushbutton1_Callback(hObject, eventdata, handles)
axes(handles.axes1);
iif = 0;
i = 1;
y = 0;
while (i < 1000)
    yf = rand(1);
    y = [y, yf];
    iif = [i,iif];
    i = i + 1;
    plot(iif,y);
    pause(0.001);
end
函数varargout=myplot(varargin)
gui_Singleton=1;
gui\u State=struct('gui\u Name',mfilename。。。
“gui_Singleton”,gui_Singleton。。。
“gui\u OpeningFcn”,@myplot\u OpeningFcn。。。
“gui\u OutputFcn”,@myplot\u OutputFcn。。。
“gui_布局FCN”,[]。。。
“gui_回调”,[]);
如果nargin&&ischar(varargin{1})
gui_State.gui_Callback=str2func(varargin{1});
结束
如果痛风
[varargout{1:nargout}]=gui_mainfcn(gui_State,varargin{:});
其他的
gui_mainfcn(gui_State,varargin{:});
结束
%结束初始化代码-不编辑
%---在myplot显示之前执行。
函数myplot_OpeningFcn(hObject、eventdata、handles、varargin)
handles.output=hObject;
%更新句柄结构
guidata(hObject、handles);
函数varargout=myplot\u OutputFcn(hObject、eventdata、handles)
varargout{1}=handles.output;
%---在按下按钮1时执行。
函数pushbutton1\u回调(hObject、eventdata、句柄)
轴(手柄、轴1);
iif=0;
i=1;
y=0;
而(i<1000)
yf=兰特(1);
y=[y,yf];
iif=[i,iif];
i=i+1;
地块(iif,y);
暂停(0.001);
结束
如何替换
iif=[I,iif]到计时器中

我想要的是根据时间(以秒为单位)绘制数据,而不是数据与循环迭代。有人知道吗?谢谢。

您可以使用和来跟踪已过的秒数
tic
启动计数器,所有对
toc
的连续调用返回自上次
tic
以来经过的秒数

iif = 0;
i = 1;
y = 0;

hplot = plot(iif, y);
xlabel('Elapsed Time (s)')
ylabel('Value')

% Force a graphics refresh so that isn't counted in our elapsed time
drawnow

% Start the timer
tic

while (i < 1000)
    yf = rand(1);
    y = cat(2, y, yf);

    % Call toc to get the current elapsed time
    iif = cat(2, iif, toc);

    i = i + 1;

    set(hplot, 'xdata', iif, 'ydata', y);
    pause(0.001)
end

谢谢,我只需要替换iif=[toc,iif];谢谢你的建议,但这只是一个非常大代码的最小示例。@statisticalbeginner可以理解。请记住,通过动态扩展阵列来重新分配数据的成本可能非常高,特别是当您谈论数千次迭代时。我刚刚意识到,由于我所做的合并,这会使性能最差。我在那里损失了2秒,在我正在执行的实现中,这是完全不可接受的。我会考虑减少时间的方法。thanks@statisticalbeginner你知道你要做多少次迭代吗?或者,一个常见的替代方法是,每次必须展开矩阵时,将矩阵的大小扩大一倍。
nIterations = 1000;
iif = nan(nIterations, 1);
y = nan(nIterations, 1);

hplot = plot(iif, y);

tic

for k = 1:nIterations
    y(k) = rand(1);
    iif(k) = toc;

    set(hplot, 'XData', iif, 'YData', y)
    pause(0.001)
end