对于 EEGLAB 的不同数据集和条件的循环
For loop for different datasets and conditions for EEGLAB
我必须分析一些 EEG 数据,并且我正在尝试使预处理过程自动化。
我有 40 位参与者。每个参与者都有 4 个不同的文件,用于 4 个条件。
所以文件保存为
1-1
1-2
1-3
1-4
2-1
2-2
2-3
2-4
...
最多 40-4
文件来自BioSemi (.bdf)
我已经能够自动化预处理程序,但每次我都必须选择不同的文件,运行 脚本,然后保存它。
我想要 运行 一个 for 循环,它自己完成所有的事情(采取 1-1,运行 预处理,保存,采取 1-2...等等) .
下面我将粘贴到目前为止的内容。
我一整天都在尝试编写一个 for 循环,但就是行不通。
非常感谢任何帮助。
这是当前的预处理脚本:
subject = '1-1.bdf'
%Open EEGLAB and inizialize several EEGLAB variables (listed in the output
%function
[ALLEEG EEG CURRENTSET ALLCOM] = eeglab;
%Load a file
%EEG=pop_loadset; % pop up window to input arguments
EEG = pop_biosig(subject) %Reads in the dataset frin a BIOSEMI file
% Stores the dataset into EEGLAB
[ALLEEG EEG CURRENTSET ] = eeg_store(ALLEEG, EEG);
%Change sampling rate to 512
EEG = eeg_checkset( EEG );
EEG = pop_resample( EEG, 512);
[ALLEEG EEG CURRENTSET] = pop_newset(ALLEEG, EEG, CURRENTSET); %save it as a new dataset
% Edit Channel Location
EEG = eeg_checkset( EEG );
EEG=pop_chanedit(EEG, 'lookup','D:\Matlab\eeglab_current\eeglab13_5_4b\plugins\dipfit2.3\standard_BESA\standard-10-5-cap385.elp');
% Store the dataset into EEGLAB
[ALLEEG EEG CURRENTSET] = pop_newset(ALLEEG, EEG, 2,'overwrite','on','gui','off');
% Add some comments
EEG.comments = pop_comments(EEG.comments,'','Sampling rate was changed to 512.',1);
% You can see the comments stored with the dataset either by typing >> EEG.comments or selecting the menu option Edit->About this dataset.
%Select Data. Remove EXG5:EXG8
EEG = eeg_checkset( EEG );
EEG = pop_select( EEG,'nochannel',{'EXG5' 'EXG6' 'EXG7' 'EXG8'});
[ALLEEG EEG CURRENTSET] = pop_newset(ALLEEG, EEG, 2,'overwrite','on','gui','off');
%HighPassFilter 0.5
EEG = eeg_checkset( EEG );
EEG = pop_eegfilt( EEG, 0.5, 0, [], [0], 0, 0, 'fir1', 0);
[ALLEEG EEG CURRENTSET] = pop_newset(ALLEEG, EEG, 2,'overwrite','on','gui','off');
%LowPassFilter 50
EEG = eeg_checkset( EEG );
EEG = pop_eegfilt( EEG, 0, 50, [], [0], 0, 0, 'fir1', 0);
[ALLEEG EEG CURRENTSET] = pop_newset(ALLEEG, EEG, 2,'overwrite','on','gui','off');
%ReReference to 35 36 (EXG3. EXG4)
EEG = eeg_checkset( EEG );
EEG = pop_reref( EEG, [35 36] );
[ALLEEG EEG CURRENTSET] = pop_newset(ALLEEG, EEG, 2,'overwrite','on','gui','off');
% Reject Continuous By Eye
EEG = eeg_checkset( EEG );
pop_eegplot( EEG, 1, 0, 1);
eeglab redraw % Update the EEGLAB window to view changes
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%Automatic Channel Rejection
EEG = eeg_checkset( EEG );
EEG = pop_rejchan(EEG, 'elec',[1:34] ,'threshold',5,'norm','on','measure','prob');
[ALLEEG EEG CURRENTSET] = pop_newset(ALLEEG, EEG, 2,'overwrite','on','gui','off');
eeglab redraw % Update the EEGLAB window to view changes
以下是循环访问文件名的方法,这样您就可以 运行 您的 MATLAB 脚本。最简单的做法是将 .bdf 文件单独放在一个文件夹中。然后写一个函数来包装你想要的功能,像这样:
function run_script_with_loop(pathname)
file_struct_list = dir([pathname filesep() '*.bdf']); %% get list of .bdf files in the pathname specified
filename_list = {file_struct_list.name}; %% extract the filenames into a cellarray
for subject = filename_list %% this iterates over the elements of the cell array, one-by-one, setting the `filename` variable like a loop variable
[ALLEEG EEG CURRENTSET ALLCOM] = eeglab;
full_pathname = [pathname filesep() subject{1}];
EEG = pop_biosig(full_pathname); %% perform your processing
...
end
几点评论:
我正试图通过使用 filesep()
与平台无关所以
这应该适用于 linux / mac/ windows。如果您正在 运行 编写代码
在与数据文件相同的目录中,您当然可以简化
这个
确保在取消引用 subject
时使用大括号 {}
。如果您将标准 matlab 数组引用与 subject(1)
一起使用,那么您将获得一个包含文件名字符串的元胞数组,而不仅仅是普通文件名字符串
MATLAB中的dir()
命令就像windows中的dir
,或Linux中的ls
,你可以使用通配符获取自定义文件列表,例如 dir('1-*.bdf')
仅获取主题 1 的数据文件列表
我必须分析一些 EEG 数据,并且我正在尝试使预处理过程自动化。
我有 40 位参与者。每个参与者都有 4 个不同的文件,用于 4 个条件。
所以文件保存为
1-1
1-2
1-3
1-4
2-1
2-2
2-3
2-4
...
最多 40-4
文件来自BioSemi (.bdf)
我已经能够自动化预处理程序,但每次我都必须选择不同的文件,运行 脚本,然后保存它。
我想要 运行 一个 for 循环,它自己完成所有的事情(采取 1-1,运行 预处理,保存,采取 1-2...等等) .
下面我将粘贴到目前为止的内容。
我一整天都在尝试编写一个 for 循环,但就是行不通。
非常感谢任何帮助。
这是当前的预处理脚本:
subject = '1-1.bdf'
%Open EEGLAB and inizialize several EEGLAB variables (listed in the output
%function
[ALLEEG EEG CURRENTSET ALLCOM] = eeglab;
%Load a file
%EEG=pop_loadset; % pop up window to input arguments
EEG = pop_biosig(subject) %Reads in the dataset frin a BIOSEMI file
% Stores the dataset into EEGLAB
[ALLEEG EEG CURRENTSET ] = eeg_store(ALLEEG, EEG);
%Change sampling rate to 512
EEG = eeg_checkset( EEG );
EEG = pop_resample( EEG, 512);
[ALLEEG EEG CURRENTSET] = pop_newset(ALLEEG, EEG, CURRENTSET); %save it as a new dataset
% Edit Channel Location
EEG = eeg_checkset( EEG );
EEG=pop_chanedit(EEG, 'lookup','D:\Matlab\eeglab_current\eeglab13_5_4b\plugins\dipfit2.3\standard_BESA\standard-10-5-cap385.elp');
% Store the dataset into EEGLAB
[ALLEEG EEG CURRENTSET] = pop_newset(ALLEEG, EEG, 2,'overwrite','on','gui','off');
% Add some comments
EEG.comments = pop_comments(EEG.comments,'','Sampling rate was changed to 512.',1);
% You can see the comments stored with the dataset either by typing >> EEG.comments or selecting the menu option Edit->About this dataset.
%Select Data. Remove EXG5:EXG8
EEG = eeg_checkset( EEG );
EEG = pop_select( EEG,'nochannel',{'EXG5' 'EXG6' 'EXG7' 'EXG8'});
[ALLEEG EEG CURRENTSET] = pop_newset(ALLEEG, EEG, 2,'overwrite','on','gui','off');
%HighPassFilter 0.5
EEG = eeg_checkset( EEG );
EEG = pop_eegfilt( EEG, 0.5, 0, [], [0], 0, 0, 'fir1', 0);
[ALLEEG EEG CURRENTSET] = pop_newset(ALLEEG, EEG, 2,'overwrite','on','gui','off');
%LowPassFilter 50
EEG = eeg_checkset( EEG );
EEG = pop_eegfilt( EEG, 0, 50, [], [0], 0, 0, 'fir1', 0);
[ALLEEG EEG CURRENTSET] = pop_newset(ALLEEG, EEG, 2,'overwrite','on','gui','off');
%ReReference to 35 36 (EXG3. EXG4)
EEG = eeg_checkset( EEG );
EEG = pop_reref( EEG, [35 36] );
[ALLEEG EEG CURRENTSET] = pop_newset(ALLEEG, EEG, 2,'overwrite','on','gui','off');
% Reject Continuous By Eye
EEG = eeg_checkset( EEG );
pop_eegplot( EEG, 1, 0, 1);
eeglab redraw % Update the EEGLAB window to view changes
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%Automatic Channel Rejection
EEG = eeg_checkset( EEG );
EEG = pop_rejchan(EEG, 'elec',[1:34] ,'threshold',5,'norm','on','measure','prob');
[ALLEEG EEG CURRENTSET] = pop_newset(ALLEEG, EEG, 2,'overwrite','on','gui','off');
eeglab redraw % Update the EEGLAB window to view changes
以下是循环访问文件名的方法,这样您就可以 运行 您的 MATLAB 脚本。最简单的做法是将 .bdf 文件单独放在一个文件夹中。然后写一个函数来包装你想要的功能,像这样:
function run_script_with_loop(pathname)
file_struct_list = dir([pathname filesep() '*.bdf']); %% get list of .bdf files in the pathname specified
filename_list = {file_struct_list.name}; %% extract the filenames into a cellarray
for subject = filename_list %% this iterates over the elements of the cell array, one-by-one, setting the `filename` variable like a loop variable
[ALLEEG EEG CURRENTSET ALLCOM] = eeglab;
full_pathname = [pathname filesep() subject{1}];
EEG = pop_biosig(full_pathname); %% perform your processing
...
end
几点评论:
我正试图通过使用
filesep()
与平台无关所以 这应该适用于 linux / mac/ windows。如果您正在 运行 编写代码 在与数据文件相同的目录中,您当然可以简化 这个确保在取消引用
subject
时使用大括号{}
。如果您将标准 matlab 数组引用与subject(1)
一起使用,那么您将获得一个包含文件名字符串的元胞数组,而不仅仅是普通文件名字符串MATLAB中的
dir()
命令就像windows中的dir
,或Linux中的ls
,你可以使用通配符获取自定义文件列表,例如dir('1-*.bdf')
仅获取主题 1 的数据文件列表