我需要计算一些变量的均值,标准差和其他值,我想知道如何使用循环来获得优势。我有5个数据电极。所以要计算每个人的平均值,我这样做:
mean_ch1 = mean(ch1);
mean_ch2 = mean(ch2);
mean_ch3 = mean(ch3);
mean_ch4 = mean(ch4);
mean_ch5 = mean(ch5);
我想要的是能够将代码压缩成一行左右。我试过的代码不起作用:
for i = 1:5
mean_ch(i) = mean(ch(i));
end
我知道这段代码是错误的,但它传达了我想要完成的想法。我想最终得到5个由循环命名的独立变量或一个包含所有5个变量的单元数组,以便于调用。我知道必须有一种方法来编写这段代码我只是不确定如何完成它。
答案 0 :(得分:11)
您可以选择以下方式:
您可以先将所有通道数据放入一个大矩阵中,然后使用函数MEAN计算行或列的平均值。例如,如果每个chX
变量是N-by-1数组,则可以执行以下操作:
chArray = [ch1 ch2 ch3 ch4 ch5]; %# Make an N-by-5 matrix
meanArray = mean(chArray); %# Take the mean of each column
您可以先将所有通道数据放入单元格数组,然后使用函数CELLFUN计算每个单元格的平均值:
meanArray = cellfun(@mean,{ch1,ch2,ch3,ch4,ch5});
即使每个chX
数组的长度彼此不同,这也会有效。
您可以使用EVAL为每个渠道平均值生成单独的变量:
for iChannel = 1:5
varName = ['ch' int2str(iChannel)]; %# Create the name string
eval(['mean_' varName ' = mean(' varName ');']);
end
答案 1 :(得分:0)
如果它总是正好5个频道,你可以
ch = {ch1, ch2, ch3, ch4, ch5}
for j = 1:5
mean_ch(j) = mean(ch{j});
end
更复杂的方式是
for j = 1:nchannels
mean_ch(j) = eval(['mean(ch' num2str(j) ')']);
end
答案 2 :(得分:0)
除了gnovice的回答。您可以使用结构和动态字段名称来完成任务。首先,我假设您的通道数据变量都采用 ch * 格式,并且是MATLAB工作区中唯一的变量。您可以执行以下操作
%# Move the channel data into a structure with fields ch1, ch2, ....
%# This could be done by saving and reloading the workspace
save('channelData.mat','ch*');
chanData = load('channelData.mat');
%# Next you can then loop through the structure calculating the mean for each channel
flds = fieldnames(chanData); %# get the fieldnames stored in the structure
for i=1:length(flds)
mean_ch(i) = mean(chanData.(flds{i});
end