【问题标题】:append char array to cell array in matlab将char数组附加到matlab中的单元格数组
【发布时间】:2014-07-12 00:02:48
【问题描述】:

我是一个 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。它返回一个目录中与正则表达式匹配的所有文件的字符数组,在这种情况下,每个会话目录有 56 个文件。

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

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

这个:

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 字符数组,即我的第一个会话目录中所有文件的文件名,而第二个则没有。

我不确定重述我做过的每件错误的事情会有多大用处,所以我不会。

提前感谢您的帮助。

根据请求编辑以包含来自 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。

【问题讨论】:

  • 您的spm_select 真的返回一个字符数组,还是一个字符串元胞数组? (文件名可能有不同的长度)。您可以编辑问题以发布spm_select 的输出示例吗?
  • 如果你想要的是:所有sessions 文件夹中的文件名。然后this 将为您工作。称它为fileList = getAllFiles(data_path);
  • 谢谢路易斯,我这样做了。 Parag,我不想要所有的文件名。我只想要那些匹配正则表达式的。
  • 1.在您的spm_select 函数中,哪里提到了正则表达式? 2. 你为什么写P{(j-1)*56+1}j 只取两个值:{1,2}。 3. 如何获得112x1 元胞数组?输入j=2 会得到 57,因此最多可以得到 57 个元素的长元胞数组。可以whos P 把输出粘贴到这里吗?
  • 1) 是正则表达式而不是这个术语:'^d.*\.img$'?对不起,如果我没有使用正确的词 2) 我不是在捍卫它的逻辑。我想也许 Matlab 会将数组放在我命名的第一个插槽中。老实说,我只是把它作为我尝试过的事情的一个例子。我确实尝试了一些对我更有意义的方法:P{(j-1)*56+1:j*56} The right hand side of this assignment has too few values to satisfy the left hand side. Error in arr (line 8) P{(j-1)*56+1:j*56} = spm_select('FPList', fullfile(data_path,subjects{i}, sessions{j}), '^d.*\.img$');

标签: arrays matlab cell


【解决方案1】:

你可以试试这个代码:

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 循环中,您必须在使用时更改文件扩展名。

【讨论】:

  • 谢谢你,@Naveen。这可以获取文件夹中的所有文件,但不能选择以 d 开头的文件。除了我想引用的目录之外,我在主题目录中还有其他目录。另外,我应该更明确地说明这一点,但学习操作 spm_select 的输出对我来说很重要。我不会逃避它。我正在尝试一种将 spm_select 的输出转换为循环内的单元格数组并使用 vertcat 的解决方案,但我还没有找到它。我必须离开电脑,但如果我弄明白了,我会告诉你的。
  • 当我最终解决问题时,我使用了您的答案元素。非常感谢——我不知道命令“vertcat”。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-06
  • 2018-04-26
  • 2018-05-27
  • 1970-01-01
  • 2015-08-10
  • 1970-01-01
相关资源
最近更新 更多