感谢您的帮助。
问题是:
我需要用户根据扩展名选择一个文件,比如说.tif。我使用标准方法,即
[flnm,locn]=uigetfile({'*.tif','Image files'}, 'Select an image');
ext = '.tif';
但是我需要从其他子目录中获取其他图像文件。假设返回locn
的目录名是:/user/blade/checklist/exp1/trial_1/run_1/exp001.tif
。图片转到exp100.tif
。
我想访问:
/user/blade/checklist/exp1/trial_1/run_2/exp001.tif.
同时访问:
/user/blade/checklist/exp1/trial_2/run_2/exp001.tif.
最多 trial_n
但如果我列出/user/blade/checklist/exp1/
中的目录,我会从中获取所有文件夹,从而可以重建正确的路径。命名结构是有序的。
我目前的解决方案是
[flnm,locn]=uigetfile({'*.tif','Image files'}, 'Select an image');
ext = '.tif';
parts = strsplit(locn, '/');
f = fullfile(((parts{end-5}),(parts{end-4}),(parts{end-3}),(parts{end-2}),(parts{end-1}));
哪个真的很丑,我也失去了第一个/
。任何帮助表示赞赏。
谢谢!
答案 0 :(得分:0)
首先,像你一样获取文件位置;注意我为使用变量ext
做了一些小改动。
ext = '.txt';
[flnm,locn]=uigetfile({['*',ext]}, 'Select an image');
parts = strsplit(locn,'/');
root = parts(1:end-4);
parts
有2个信息 - 1)所选文件的路径; 2)您需要的工作文件夹checklist
的路径。所以root
有工作文件夹。
然后,列出您想要的所有文件,并将它们放在单元格数组中。
文件名应包含部分(子文件夹)路径;按照这种模式并不难。
flist = {'trial_1/run_1/exp001.tif', ...
'trial_1/run_1/exp002.tif', ...
'trial_1/run_2/exp001.tif', ...
'trial_2/run_1/exp001.tif', ...
'trial_2/run_2/exp001.tif'};
我只列举了一些;您可以使用for
循环自动生成trial_n
和expxxx.tif
。生成完整文件列表的示例代码(但不是"完整路径") -
flist = cell(10*2*100,1);
for ii = 1:10
for jj = 1:2
for kk = 1:100
flist{sub2ind([10,2,100],ii,jj,kk)} = ...
sprintf('trial_%d/run_%d/exp%03d%s', ii,...
jj, kk, ext);
end
end
end
最后,使用strjoin
连接第一部分(您的工作文件夹)和第二部分(子文件夹中的所需文件)。使用cellfun
为文件列表单元格数组中的每个单元格调用strjoin
,因此对于您希望的每个文件,您都可以获得完整路径。
full_flist = cellfun(@(x) strjoin([root, x],'/'), ...
flist, 'UniformOutput', false);
示例输出 -
>> locn
locn =
/home/user/Downloads/exp1/trial_1/run_1/
>> for ii = 1:5
full_flist{ii}
end
ans =
/home/user/Downloads/trial_1/run_1/exp001.tif
ans =
/home/user/Downloads/trial_1/run_1/exp002.tif
ans =
/home/user/Downloads/trial_1/run_2/exp001.tif
ans =
/home/user/Downloads/trial_2/run_1/exp001.tif
ans =
/home/user/Downloads/trial_2/run_2/exp001.tif
>>
注意:您可以使用
strjoin(str1, str2, '/')
或
sprintf('%s/%s', str1, str2)
它们是等价的。