3

多数の変数の平均値、標準偏差、およびその他の値を計算する必要があり、ループを有利に使用する方法を考えていました。私はデータの5つの電極を持っています。したがって、それぞれの平均を計算するには、次のようにします。

mean_ch1 = mean(ch1);  
mean_ch2 = mean(ch2);  
mean_ch3 = mean(ch3);  
mean_ch4 = mean(ch4);  
mean_ch5 = mean(ch5);  

私が欲しいのは、そのコードを 1 行程度に凝縮できるようにすることです。私が試したコードは機能しません:

for i = 1:5  
  mean_ch(i) = mean(ch(i));  
end

このコードが間違っていることはわかっていますが、私が達成しようとしていることのアイデアを伝えています。ループによって名前が付けられた 5 つの個別の変数、または 5 つの変数すべてを含むセル配列を作成して、簡単に思い出せるようにしたいと考えています。このコードを書く方法があるに違いないことはわかっていますが、それを達成する方法がわかりません。

4

3 に答える 3

11

これを行う方法には、いくつかのオプションがあります。

  • 最初にすべてのチャネル データを 1 つの大きな行列に入れ、次に関数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
    
  • 最初にすべてのチャネル データを cell 配列に入れ、次に関数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

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 に答える
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 に答える