Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MATLAB回调返回矩阵_Matlab_Signals_Uicontrol - Fatal编程技术网

MATLAB回调返回矩阵

MATLAB回调返回矩阵,matlab,signals,uicontrol,Matlab,Signals,Uicontrol,原职: 我现在有了问题的第二部分。 和以前一样,我有一个19*1000*134的矩阵,这要感谢Aero Engy在上一篇文章中给出的完美答案 我想在我的工作空间中创建一个名为clean的向量,它的长度为134 默认情况下,clean(i)(i介于1和134之间)的值将为1——但是,如果我按下UI界面上的按钮,该值必须为0 我的密码在吼叫,只是不要给我任何输出。按钮似乎起作用了,但是当我关闭图形时,我没有得到干净的矢量 function cleanData(data); % data = rand

原职:

我现在有了问题的第二部分。 和以前一样,我有一个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
我做错了什么

奖励:如果

  • 当我按下按钮“Not clean”时,滑块也会改变值和增量(当前,我必须按下按钮,然后按下滑块的右箭头以转到下一个2秒的数据)
  • 一旦我为一个通道(矩阵19行中的一行)选中“清洁”或“不清洁”,对于下一个通道,它将跳过“不清洁”数据(即,清洁矩阵中的0对应于历元编号)

谢谢你的帮助,我对MATLAB很陌生,即使我进步很快,我也远没有完全理解这段代码。

在NOTCLINE回调中,我作为一个全局用户调用了
clean
。我还删除了它作为输入。。。因为它是一个全球性的,所以没有必要传递它

此外,我还添加了代码,以便在每次按下按钮时使滑块1前进

在您的工作区中,关闭GUI以查看您标记的内容后,只需在命令行中执行以下操作即可访问
clean
数组。(数字是随机的,我标记为不干净

我现在必须离开,所以我无法解决第二个问题,即更换频道和跳过~clean elementr…,但这应该不是很难。我将在几个小时后回到这里

>> global clean
>> find(~clean)
ans =
  3  4  11 19
修改代码: 编辑:在跳过频道的边缘添加代码保护。

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,s,a});

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)
global clean
persistent prevI

if isempty(prevI)
    prevI = 1;
end

viewI = round(s.Value);
sDir = sign(viewI - prevI);  %-1 if going backwards +1 if going forward
prevI = viewI;

if clean(viewI) == 0
    newPos = viewI + sDir;
    if newPos < 1 || newPos > s.Max
        return
    end
    s.Value = newPos; 
    sliderChange(s,[],a)
else
    disp(['Current Epoch: ' num2str(viewI)]) %console print
    xlim(a,[(viewI-1)*2 viewI*2] + [-.1 .1])  
end


function notClean(c,evtData,s,a)
global clean %Call the global
num = round(s.Value);
clean(num) = 0;
disp(['Epoch ' num2str(num) ' not clean']) %console print
%Advance to the next slider position.
if num+1 < s.Max
    s.Value = num+1;
    sliderChange(s,[],a)
end
函数清除数据(数据)
%数据=兰特(191000134);
全球清洁
清洁=一(1,尺寸(数据,3));
f=数字(‘单位’、‘标准化’、‘位置’、[0.25 0.25 0.5 0.5]);
a=轴(‘单位’、‘标准化’、‘位置’、[0.05 0.15,0.75 0.75]);
s=uicontrol(f,‘样式’、‘滑块’、‘单位’、‘标准化’、‘位置’、[0.05 0.025、0.75 0.05]、,。。。
'Min',1,'Max',size(数据,3),'Value',1,'Callback',{@sliderChange,a});
l=uicontrol(f,‘样式’、‘列表框’、‘单位’、‘标准化’、‘位置’、[0.85 0.15,0.1,0.75]、,。。。
'String',cellstr(num2str([1:size(data,1)]),'Callback',{@changechnel,a,s,data});
c=uicontrol(f,‘样式’、‘按钮’、‘单位’、‘标准化’、‘字符串’、‘不干净’、,。。。
'位置',[0.85 0.025 0.1 0.05],'Callback',{@notClean,s,a});
步长=1/(s.Max-s.Min);
s、 滑块步长=[步长2*步长];
更改通道(l、[]、a、s、数据)
功能更改通道(l、evtData、a、s、数据)
cla(a);
chanNum=str2double(l.String{l.Value});
sR=500;%500Hz
tempData=重塑(数据(chanNum,:,:),[],大小(数据,3));%将每个历元重塑为一列
TENTIME=[0:1/sR:(大小(数据,2)-1)/sR]'+(0:1:size(数据,3)-1)*2;%构建时数组
绘图(a、TENTIME、tempData)%绘制所有线条
s、 值=1;%静止滑块位置
功能滑块更改(s、evtData、a)
全球清洁
持续性prevI
如果是空的(上一个)
prevI=1;
结束
viewI=圆形(s值);
sDir=符号(viewI-prevI);%如果向后,则为-1;如果向前,则为1
prevI=视图i;
如果清洁(视图i)=0
newPos=viewI+sDir;
如果newPos<1 | | newPos>s.Max
返回
结束
s、 值=newPos;
幻灯片切换(s,[],a)
其他的
显示(['当前历元:'num2str(视图)])%控制台打印
xlim(a,[(视图i-1)*2视图i*2]+[-.1.1])
结束
功能不干净(c、evtData、s、a)
全球清洁%呼叫全球清洁
num=四舍五入(s值);
清洁(num)=0;
显示(['Epoch'num2str(num)'notclean'])%console打印
%前进到下一个滑块位置。
如果num+1小于s.Max
s、 数值=num+1;
幻灯片切换(s,[],a)
结束

在notClean回调中,我将其作为全局调用。我还将其作为输入删除…因为它是全局调用,所以不必传入

此外,我还添加了代码,以便在每次按下按钮时使滑块1前进

在您的工作区中,关闭GUI以查看您标记的内容后,只需在命令行中执行以下操作即可访问
clean
数组。(数字是我标记为不干净的随机数字

我现在必须离开,所以我无法解决第二个问题,即更换频道和跳过~clean elementr…,但这应该不是很难。我将在几个小时后回到这里

>> global clean
>> find(~clean)
ans =
  3  4  11 19
修改代码: 编辑:在跳过频道的边缘添加代码保护。

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,s,a});

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)
global clean
persistent prevI

if isempty(prevI)
    prevI = 1;
end

viewI = round(s.Value);
sDir = sign(viewI - prevI);  %-1 if going backwards +1 if going forward
prevI = viewI;

if clean(viewI) == 0
    newPos = viewI + sDir;
    if newPos < 1 || newPos > s.Max
        return
    end
    s.Value = newPos; 
    sliderChange(s,[],a)
else
    disp(['Current Epoch: ' num2str(viewI)]) %console print
    xlim(a,[(viewI-1)*2 viewI*2] + [-.1 .1])  
end


function notClean(c,evtData,s,a)
global clean %Call the global
num = round(s.Value);
clean(num) = 0;
disp(['Epoch ' num2str(num) ' not clean']) %console print
%Advance to the next slider position.
if num+1 < s.Max
    s.Value = num+1;
    sliderChange(s,[],a)
end
函数清除数据(数据)
%数据=兰特(191000134);
全球清洁
清洁=一(1,尺寸(数据,3));
f=数字(‘单位’、‘标准化’、‘位置’、[0.25 0.25 0.5 0.5]);
a=轴(‘单位’、‘标准化’、‘位置’、[0.05 0.15,0.75 0.75]);
s=uicontrol(f,‘样式’、‘滑块’、‘单位’、‘标准化’、‘位置’、[0.05 0.025、0.75 0.05]、,。。。
'Min',1,'Max',size(数据,3),'Value',1,'Callback',{@sliderChange,a});
l=uicontrol(f,‘样式’、‘列表框’、‘单位’、‘标准化’、‘位置’、[0.85 0.15,0.1,0.75]、,。。。
'String',cellstr(num2str([1:size(data,1)]),'Callback',{@changechnel,a,s,data});
c=uicontrol(f,‘样式’、‘按钮’、‘单位’、‘标准化’、‘字符串’、‘不干净’、,。。。
'位置',[0.85 0.025 0.1 0.05],'Callback',{@notClean,s,a});
步长=1/(s.Max-s.Min);
s、 滑块步长=[步长2*步长];
更改通道(l、[]、a、s、数据)
功能更改通道(l、evtData、a、s、数据)
cla(a);
chanNum=str2double(l.String{l.Value});
sR=500;%500Hz
tempData=重塑(数据(chanNum,:,:),[],大小(数据,3));%将每个历元重塑为一列
TENTIME=[0:1/sR:(大小(数据,2)-1)/sR]'+(0:1:size(d)