3

我需要计算一些变量的平均值、标准偏差和其他值,我想知道如何使用循环来发挥我的优势。我有 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 个变量,以便于调用。我知道必须有一种方法来编写这段代码我只是不知道如何完成它。

4

3 回答 3

11

您有几个选项可以做到这一点:

  • 您可以先将所有通道数据放入一个大矩阵中,然后使用函数MEAN计算行或列的平均值。例如,如果每个chX变量都是 N×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
    
于 2010-06-29T19:20:46.103 回答
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
于 2010-06-29T19:22:34.930 回答
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
于 2010-06-29T19:28:23.917 回答