【问题标题】:Looping through multiple subjects/sessions循环遍历多个主题/会话
【发布时间】:2018-05-18 05:11:39
【问题描述】:

大家好,我写了一个 for 循环,我想在一个主题的多个会话中使用它。我有一个数据路径:C:\Users\Rouve\Documents\Promotion\tDCS\DATA\VP01\ 其中三个文件夹:Session1、Session2、Session3 所在。这些文件夹中的每一个都包含 15 个文本文件(test1.txt、test2.txt ... test15.txt)。我的目标是运行 for 循环,它将 15 个文件加载到一个会话中,将它们放入一个单元格中,提取该单元格内每个数据集的最大值,然后在所有会话中平均每三个最大值并将它们放入一个最终文件,所以每个会话我会得到 5 个值。 当我为一个会话运行循环时,它可以工作并且看起来像这样:

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';

我似乎无法弄清楚如何构造 for 循环,因此它会自动为所有三个会话执行此操作并输出三个变量,其中包含会话 01、会话 02 和会话 03 的 5 个值。我真的希望你能提供帮助我!

【问题讨论】:

    标签: matlab for-loop cell


    【解决方案1】:

    您可以使用[] 连接字符串,就像创建一个常规数组一样,然后在循环中处理每个文件夹,同时将平均数据存储在一个公共数组中,

    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 的一行中。处理完所有目录后,它使用 matlab save 命令将公共数组保存到文件 'mean_out.txt' 中以获取 ascii 格式。

    由于您的程序不容易重现,我没有检查它 - 如果您遇到错误,请告诉我。

    这也是一种可能性 - 还有其他可能性,例如在每次外循环 (nv) 迭代后将数据附加到文件中,在这种情况下不需要公共数组。由于您的数据长度相同,因此无需在循环结束时重置重用变量,但请记住,当您的数据长度不同时,这是预防错误的必要条件。

    【讨论】:

    • 嘿,感谢@atru 的回复,很抱歉再次打扰,但你能指定我将如何将代码移动到里面...我试过这样做,但它要么射击我一条错误消息,或者它只返回一个变量(所以对于一个会话)-再次抱歉无法:/
    • 你说得对,这里需要做更多的工作。很快就会更新。
    • 非常感谢。感谢您的帮助 =)
    • 我试过了,我收到错误:下标分配维度不匹配。另外我想尝试更好地澄清我的问题:我希望循环一个接一个地进入三个文件夹(session1、session2、session3)并执行加载.txt文件的函数,如所述,列出它们名称,从 15 个 .txt 文件中取最大值,取最大值 1-3,4-6,7-9,10-12,13-15 的平均值,因此每个会话有 5 个平均值。我希望我能解释得更清楚一点。感谢您的帮助!
    • @RouVen - 我的错,有一个错误。我现在用一个简单但希望足够相似的测试用例对其进行了测试,所以它现在应该可以工作了。
    猜你喜欢
    • 1970-01-01
    • 2011-08-28
    • 1970-01-01
    • 1970-01-01
    • 2020-06-14
    • 1970-01-01
    • 2019-07-21
    • 2019-01-03
    相关资源
    最近更新 更多