【发布时间】:2017-11-13 20:02:04
【问题描述】:
我的问题现在有了第二部分。 和以前一样,我正在绘制一个 19*1000*134 矩阵,这要归功于 Aero Engy 在上一篇文章中的出色回答。
我想在我的工作区中创建一个名为 clean 的向量,其长度为 134。
默认情况下,clean(i) 的值(i 介于 1 和 134 之间)将为 1 -- 但是,如果我按下 UI 界面上的按钮,该值必须变为 0。
我的代码如下,只是不要给我任何输出。该按钮似乎可以工作,但是当我关闭该图时,我没有得到干净的矢量。
function cleanData(data);
% data = rand(19,1000,134);
global clean
clean = ones(1,size(data,3));
f = figure('Units','Normalized','Position',[0.25 0.25 0.5 0.5]);
a = axes('Units','Normalized','Position',[0.05 0.15, 0.75 0.75]);
s = uicontrol(f, 'Style','Slider', 'Units','Normalized','Position',[0.05 0.025, 0.75 0.05],...
'Min',1,'Max',size(data,3),'Value',1, 'Callback',{@sliderChange,a});
l = uicontrol(f, 'Style','listbox','Units','Normalized','Position',[0.85 0.15, 0.1, 0.75],...
'String',cellstr(num2str([1:size(data,1)]')),'Callback',{@changeChannel,a,s,data});
c = uicontrol(f, 'Style','pushbutton','Units','Normalized','String','Not clean',...
'Position',[0.85 0.025 0.1 0.05],'Callback',{@notClean,clean,s});
stepSize = 1/(s.Max - s.Min);
s.SliderStep = [stepSize 2*stepSize];
changeChannel(l,[],a,s,data)
function changeChannel(l,evtData,a,s,data)
cla(a);
chanNum = str2double(l.String{l.Value});
sR = 500; %500Hz
tempData = reshape(data(chanNum,:,:),[],size(data,3)); %Reshape each epoch into a column
tempTime = [0:1/sR:(size(data,2)-1)/sR]' + (0:1:size(data,3)-1)*2; %Build time array
plot(a,tempTime,tempData) %plot all the lines
s.Value = 1; %Rest Slider Position
function sliderChange(s,evtData,a)
viewI = round(s.Value);
disp(['Current Epoch: ' num2str(viewI)]) %console print
xlim(a,[(viewI-1)*2 viewI*2] + [-.1 .1])
function notClean(c,evtData,clean,s)
num = round(s.Value);
clean(num) = 0;
disp(['Epoch ' num2str(num) ' not clean']) %console print
我做错了什么?
奖励:如果
- 当我按下“不干净”按钮时,滑块会改变值并增加(目前,我必须按下按钮,然后按下滑块的右箭头才能转到接下来 2 秒的数据)。李>
- 一旦我为一个通道(矩阵的 19 行之一)检查了“干净”或“不干净”,对于下一个通道,它将跳过“不干净”数据(即干净中的 0对应于纪元数的矩阵)。
感谢您的帮助,我是 MATLAB 的新手,即使我进步很快,我也远没有完全理解这段代码。
【问题讨论】: