我想创建一个动画,让用户可以在模拟步骤中前后移动。
动画必须模拟信道解码的迭代过程(接收器接收比特块,执行操作,然后检查块是否对应于奇偶校验规则。如果块不对应,则再次执行操作,当代码对应于给定的规则时,该过程最终结束。
我编写了执行解码过程并返回m x n x i
矩阵的函数,其中m x n是数据块,i是迭代索引。因此,如果需要3次迭代来解码数据,则函数返回m x n x 3
矩阵,每一步都被激活。
在GUI(.fig文件)中,我放置了一个“解码”按钮,它运行解码方法,并且有“后退”和“前进”按钮,这些按钮必须使用户能够在记录步骤的数据之间切换。
我已将“decodedData
”矩阵和currentStep
值存储为全局变量,因此点击“前进”和“下一步”按钮,索引必须更改并指向适当的步骤状态。 / p>
当我尝试调试应用程序时,该方法返回解码数据,但当我尝试单击“返回”和“下一步”时,解码数据似乎没有被声明。
有谁知道如何访问(或存储)函数的结果以启用我想在Matlab GUI中实现的描述逻辑?
答案 0 :(得分:1)
最终,这是变量问题的范围。
全局变量很少是正确答案。
此视频讨论了GUIDE中的句柄结构: http://blogs.mathworks.com/videos/2008/04/17/advanced-matlab-handles-and-other-inputs-to-guide-callbacks/
本视频讨论了GUI之间的变量共享,也可以应用于单个GUI问题。 http://blogs.mathworks.com/videos/2005/10/03/guide-video-part-two/
答案 1 :(得分:1)
诀窍是使用嵌套函数,以便它们共享相同的工作区。由于我已经开始使用example in your last question,现在我只是添加GUI控件以实现前进/后退交互,除了播放/停止动画:
function testAnimationGUI()
%# coordinates
t = (0:.01:2*pi)'; %# 'fix SO syntax highlight
D = [cos(t) -sin(t)];
%# setup a figure and axis
hFig = figure('Backingstore','off', 'DoubleBuffer','on');
hAx = axes('Parent',hFig, 'XLim',[-1 1], 'YLim',[-1 1], ...
'Drawmode','fast', 'NextPlot','add');
axis(hAx, 'off','square')
%# draw circular path
line(D(:,1), D(:,2), 'Color',[.3 .3 .3], 'LineWidth',1);
%# initialize point
hLine = line('XData',D(1,1), 'YData',D(1,2), 'EraseMode','xor', ...
'Color','r', 'marker','.', 'MarkerSize',50);
%# init text
hTxt = text(0, 0, num2str(t(1)), 'FontSize',12, 'EraseMode','xor');
i=0;
animation = false;
hBeginButton = uicontrol('Parent',hFig, 'Position',[1 1 30 20], ...
'String','<<', 'Callback',@beginButton_callback);
hPrevButton = uicontrol('Parent',hFig, 'Position',[30 1 30 20], ...
'String','<', 'Callback',@previousButton_callback);
hNextButton = uicontrol('Parent',hFig, 'Position',[60 1 30 20], ...
'String','>', 'Callback',@nextButton_callback);
hEndButton = uicontrol('Parent',hFig, 'Position',[90 1 30 20], ...
'String','>>', 'Callback',@endButton_callback);
hSlider = uicontrol('Parent',hFig, 'Style','slider', 'Value',1, 'Min',1,...
'Max',numel(t), 'SliderStep', [10 100]./numel(t), ...
'Position',[150 1 300 20], 'Callback',@slider_callback);
hPlayButton = uicontrol('Parent',hFig, 'Position',[500 1 30 20], ...
'String','|>', 'Callback',@playButton_callback);
hStopButton = uicontrol('Parent',hFig, 'Position',[530 1 30 20], ...
'String','#', 'Callback',@stopButton_callback);
%#----------- NESTED CALLBACK FUNCTIONS -----------------
function beginButton_callback(hObj,eventdata)
updateCircle(1)
end
function endButton_callback(hObj,eventdata)
updateCircle(numel(t))
end
function nextButton_callback(hObj,eventdata)
i = i+1;
if ( i > numel(t) ), i = 1; end
updateCircle(i)
end
function previousButton_callback(hObj,eventdata)
i = i-1;
if ( i < 1 ), i = numel(t); end
updateCircle(i)
end
function slider_callback(hObj, eventdata)
i = round( get(gcbo,'Value') );
updateCircle(i)
end
function playButton_callback(hObj, eventdata)
animation = true;
while animation
i = i+1;
if ( i > numel(t) ), i = 1; end
updateCircle(i)
end
end
function stopButton_callback(hObj, eventdata)
animation = false;
end
function updateCircle(idx)
set(hSlider, 'Value', rem(idx-1,numel(t))+1) %# update slider to match
set(hLine,'XData',D(idx,1), 'YData',D(idx,2)) %# update X/Y data
set(hTxt,'String',num2str(t(idx))) %# update angle text
drawnow %# force refresh
if ~ishandle(hAx), return; end %# check valid handle
end
%#-------------------------------------------------------
end
您可能会发现滑块功能有点不对劲,但您明白了这一点:)