2017-12-04 3 views
0

こんにちは、私は被験者の複数のセッションで使いたいforループを書いています。私はデータパスがあります:C:\ Users \ Rouve \ Documents \ Promotion \ tDCS \ DATA \ VP01 \ここで、3つのフォルダ:Session1、Session2、Session3があります。これらの各フォルダには15個のテキストファイル(test1.txt、test2.txt ... test15.txt)が含まれています。私の目標は、1つのセッション内で15個のファイルをロードし、それらをセルに入れ、そのセル内の各データセットの最大値を抽出し、すべてのセッションで3つの最大値を平均し、最終的なファイルなので、セッションあたり5つの値を取得します。 私は1つのセッションのためのループを実行すると、それが動作し、次のようになります。それはすべての3つのセッションと出力3つの変数に対してこれを自動的に行いますので、私はforループを構築する方法を見つけ出すように見えることはできません複数の件名/セッションをループする

Volume_name='C:\Users\Rouve\Documents\Promotion\tDCS\DATA\VP02\Session1'; 

files=dir(fullfile(Volume_name,'*.txt')); 
files={files.name}'; 
files_sorted=natsortfiles(files); 
fileName=ls('*txt'); 

data = cell(numel(files_sorted),1);    %# store file contents 
for i=1:numel(files_sorted) 
    fname = fullfile(Volume_name,files_sorted{i});  %# full path to file 
    data{i} = dlmread(fname, '\t', 19, 1);  %# load file 
end 
for i=1:length(data) %# get Max values of each trial (15 per session in total) 
     MaxValues(i)=max(data{i}); 
end 
MaxValues=MaxValues'; 

Mean_values=mean(reshape(MaxValues,3,[])); 
Mean_values=Mean_values'; 

、セッション01、セッション02、セッション03の5つの値を含んでいます。私が本当に助けてくれることを願っています!

答えて

0

あなたが規則的に配列を作成するかのように[]を使用して文字列を連結して、共通配列の平均データを格納しながらループ内の各フォルダを処理することができ、

subdir = {'Session1', 'Session2', 'Session3'}; 

Mean_values = zeros(3,5); 
for nv = 1:3 
    Volume_name=['C:\Users\Rouve\Documents\Promotion\tDCS\DATA\VP02\', char(subdir{nv})] 

    files=dir(fullfile(Volume_name,'*.txt')); 
    files={files.name}'; 
    files_sorted=natsortfiles(files); 
    fileName=ls('*txt'); 

    data = cell(numel(files_sorted),1);    %# store file contents 
    for i=1:numel(files_sorted) 
     fname = fullfile(Volume_name,files_sorted{i});  %# full path to file 
     data{i} = dlmread(fname, '\t', 19, 1);  %# load file 
    end 
    for i=1:length(data) %# get Max values of each trial (15 per session in total) 
      MaxValues(i)=max(data{i}); 
    end 
    MaxValues=MaxValues'; 

    Mean_values(nv, :)=mean(reshape(MaxValues,3,[])); 

    % Reset the data and MaxValues cell 
    data = {}; 
    MaxValues = []; 
end 

save('mean_out.txt', 'Mean_values', '-ascii') 

私は私が正しく理解している場合はわかりません(もしそうでなければ明確にしてください) - しかし、各フォルダの5つの手段を持つ出力ファイルが必要です。これは、このプログラムが行うことです。各フォルダについて、5つの手段を見つけて共通の配列Mean_valuesの行に格納します。すべてのディレクトリを処理した後、ASCII配列のmatlab saveコマンドを使用して、共通配列を 'mean_out.txt'ファイルに保存します。

あなたのプログラムは容易に再現できないので、私はそれをチェックしませんでした。もしあなたがエラーに遭遇したら、教えてください。

また、外部ループ(nv)の繰り返しごとにデータをファイルに追加するようなものもあります。この場合、共通配列は必要ありません。データの長さがすべて同じであるため、ループの最後に再利用された変数を再設定する必要はありませんが、データが同じ長さでない場合はバグ防止の必要性を念頭におくことをお勧めします。

+0

お返事ありがとうございます。もう一度お悔やみして申し訳ありませんが、コードをどのように内部に移動するかを指定することができます...私はそれを試みましたが、エラーメッセージを表示するか、 1つの変数を返すだけです(1つのセッションで) - もう一度、できなくて申し訳ありません:/ –

+0

あなたは正しいので、ここでいくつかの作業が必要です。すぐに更新されます。 – atru

+0

ありがとうございました。私は助けを感謝する=) –

関連する問題