【发布时间】: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$');