将char数组附加到matlab中的单元数组中

时间:2014-07-12 00:02:48

标签: arrays matlab cell

我是一名Matlab初学者,很快就会非常明显。我正在尝试组装一个具有单列文件名的单元格数组。

我有多个会话。每个会话应该有56个文件名(但有些可能很短或很长,所以我真的更喜欢一个在遇到短会话时不会中断的解决方案)。我需要循环遍历会话并将每个后续会话中的名称附加到我的单元格数组,以便在两个会话之后维度为112,1。

换句话说,我想要一个阵列:

P =

/data/session1/dvol1.img
/data/session1/dvol2.img
...
/data/session1/dvol56.img
/data/session2/dvol1.img
/data/session2/dvol2.img
...
/data/session2/dvol56.img

等等,如果有两个以上的会话。

我在会话中找到文件名的函数是spm_select。它返回一个char数组,其中包含与正则表达式匹配的目录中的所有文件,在本例中,每个会话目录有56个文件。

(我知道我的问题与这里的问题非常相似:Using loops to get multiple values into a cell但是我无法找到问题的答案,因为那个人一次只想附加一个值。)< / p>

我尝试了很多没有用过的东西。

此:

data_path = '/foo/bar/';
subjects = {'test1'};
sessions = {'session1' 'session2' };
for i=1:numel(subjects)
    clear P
    P=cell(56*numel(sessions),1); 
    for j=1:numel(sessions)
        P{(j-1)*56+1} = spm_select('FPList', fullfile(data_path,subjects{i}, sessions{j}), '^d.*\.img$');
    end   
end

生成一个112x1的单元格数组,但是第一个元素是56x57 char数组,也就是我第一个会话目录中所有文件的文件名,而第二个没有。

我不确定重述我所做过的每一个错误的事情是多么有用,所以我不会。

提前感谢您的帮助。

编辑以按请求包含spm_select的样本输出:

>> output = spm_select('FPList', fullfile(data_path,subjects{i}, sessions{j}), '^d.*\.img$')

output =

/home/katie/Desktop/sample/test1/run_1L3/draghf000001.img
/home/katie/Desktop/sample/test1/run_1L3/draghf000035.img
/home/katie/Desktop/sample/test1/run_1L3/draghf000069.img
/home/katie/Desktop/sample/test1/run_1L3/draghf000103.img
/home/katie/Desktop/sample/test1/run_1L3/draghf000137.img
/home/katie/Desktop/sample/test1/run_1L3/draghf000171.img
/home/katie/Desktop/sample/test1/run_1L3/draghf000205.img
/home/katie/Desktop/sample/test1/run_1L3/draghf000239.img
/home/katie/Desktop/sample/test1/run_1L3/draghf000273.img
/home/katie/Desktop/sample/test1/run_1L3/draghf000307.img
/home/katie/Desktop/sample/test1/run_1L3/draghf000341.img
/home/katie/Desktop/sample/test1/run_1L3/draghf000375.img
/home/katie/Desktop/sample/test1/run_1L3/draghf000409.img
/home/katie/Desktop/sample/test1/run_1L3/draghf000443.img
/home/katie/Desktop/sample/test1/run_1L3/draghf000477.img
/home/katie/Desktop/sample/test1/run_1L3/draghf000511.img
/home/katie/Desktop/sample/test1/run_1L3/draghf000545.img
/home/katie/Desktop/sample/test1/run_1L3/draghf000579.img
/home/katie/Desktop/sample/test1/run_1L3/draghf000613.img
/home/katie/Desktop/sample/test1/run_1L3/draghf000647.img
/home/katie/Desktop/sample/test1/run_1L3/draghf000681.img
/home/katie/Desktop/sample/test1/run_1L3/draghf000715.img
/home/katie/Desktop/sample/test1/run_1L3/draghf000749.img
/home/katie/Desktop/sample/test1/run_1L3/draghf000783.img
/home/katie/Desktop/sample/test1/run_1L3/draghf000817.img
/home/katie/Desktop/sample/test1/run_1L3/draghf000851.img
/home/katie/Desktop/sample/test1/run_1L3/draghf000885.img
/home/katie/Desktop/sample/test1/run_1L3/draghf000919.img
/home/katie/Desktop/sample/test1/run_1L3/draghf000953.img
/home/katie/Desktop/sample/test1/run_1L3/draghf000987.img
/home/katie/Desktop/sample/test1/run_1L3/draghf001021.img
/home/katie/Desktop/sample/test1/run_1L3/draghf001055.img
/home/katie/Desktop/sample/test1/run_1L3/draghf001089.img
/home/katie/Desktop/sample/test1/run_1L3/draghf001123.img
/home/katie/Desktop/sample/test1/run_1L3/draghf001157.img
/home/katie/Desktop/sample/test1/run_1L3/draghf001191.img
/home/katie/Desktop/sample/test1/run_1L3/draghf001225.img
/home/katie/Desktop/sample/test1/run_1L3/draghf001259.img
/home/katie/Desktop/sample/test1/run_1L3/draghf001293.img
/home/katie/Desktop/sample/test1/run_1L3/draghf001327.img
/home/katie/Desktop/sample/test1/run_1L3/draghf001361.img
/home/katie/Desktop/sample/test1/run_1L3/draghf001395.img
/home/katie/Desktop/sample/test1/run_1L3/draghf001429.img
/home/katie/Desktop/sample/test1/run_1L3/draghf001463.img
/home/katie/Desktop/sample/test1/run_1L3/draghf001497.img
/home/katie/Desktop/sample/test1/run_1L3/draghf001531.img
/home/katie/Desktop/sample/test1/run_1L3/draghf001565.img
/home/katie/Desktop/sample/test1/run_1L3/draghf001599.img
/home/katie/Desktop/sample/test1/run_1L3/draghf001633.img
/home/katie/Desktop/sample/test1/run_1L3/draghf001667.img
/home/katie/Desktop/sample/test1/run_1L3/draghf001701.img
/home/katie/Desktop/sample/test1/run_1L3/draghf001735.img
/home/katie/Desktop/sample/test1/run_1L3/draghf001769.img
/home/katie/Desktop/sample/test1/run_1L3/draghf001803.img
/home/katie/Desktop/sample/test1/run_1L3/draghf001837.img
/home/katie/Desktop/sample/test1/run_1L3/draghf001871.img

>> class(output)

ans =

char

>> size(output)

ans =

    56    57

>> 

编辑:好的,问题解决了。这是我最终使用的代码:

data_path = '/foo/bar';
subjects = {'test1'};
sessions = {'session1' 'session2' };

output={};
for i=1:numel(subjects)
    for j=1:numel(sessions)
        files=spm_select('FPList', fullfile(data_path,subjects{i},sessions{j}), '^d.*\.img$')
        f_c=cellstr(files);
        output=vertcat(output,f_c);
    end
end

我认为“如何将char数组垂直追加到列单元格数组”的答案是将其转换为单元数组并使用vertcat。

1 个答案:

答案 0 :(得分:0)

您可以尝试以下代码:

function output=file_list(path)
output={};
subjects=dir(path);
for a=3:length(subjects)
    sessions=dir(fullfile(path,subjects(a).name));
    for b=3:length(sessions)
        files=dir(fullfile(path,subjects(a).name,'/',sessions(b).name,'/*.img'));
        f_c=struct2cell(files);
        f=f_c(1,:)';
      output=vertcat(output,fullfile(path,subjects(a).name,'/',sessions(b).name,'/',f));
    end
end

此代码的一个缺点是output的大小在循环中增长。以下是一个示例:

path='/home/naveen/Desktop/example/'; % path is the main directory in which the data of 
                                      % subjects is stored in sub directories. 
output=file_list(path)

输出是:

output = 

    '/home/naveen/Desktop/example/subject_1/session_1/lipo2.png'
    '/home/naveen/Desktop/example/subject_1/session_1/lipo_6.png'
    '/home/naveen/Desktop/example/subject_1/session_1/lps_4.png'
    '/home/naveen/Desktop/example/subject_1/session_2/ltx_2.png'
    '/home/naveen/Desktop/example/subject_1/session_2/ltx_2_1.png'
    '/home/naveen/Desktop/example/subject_1/session_2/ltx_2_3.png'
    '/home/naveen/Desktop/example/subject_1/session_2/ltx_4.png'
    '/home/naveen/Desktop/example/subject_1/session_2/ltx_6.png'
    '/home/naveen/Desktop/example/subject_2/session_1/lipo2.png'
    '/home/naveen/Desktop/example/subject_2/session_1/lipo_6.png'
    '/home/naveen/Desktop/example/subject_2/session_1/lps_4.png'
    '/home/naveen/Desktop/example/subject_2/session_2/ltx_2.png'
    '/home/naveen/Desktop/example/subject_2/session_2/ltx_2_1.png'
    '/home/naveen/Desktop/example/subject_2/session_2/ltx_2_3.png'
    '/home/naveen/Desktop/example/subject_2/session_2/ltx_4.png'
    '/home/naveen/Desktop/example/subject_2/session_2/ltx_6.png'

希望这适合你。请注意,在最内部for循环中,您必须在用于您的目的时更改文件扩展名。