从MATLAB文件重构目录

从MATLAB文件重构目录,matlab,Matlab,谢谢你的帮助 问题是: 我需要用户根据扩展名选择一个文件,比如.tif。我使用了标准方法,即 [flnm,locn]=uigetfile({'*.tif','Image files'}, 'Select an image'); ext = '.tif'; 但我需要从其他子目录获取其他图像文件。假设返回到locn的目录名为:/user/blade/checklist/exp1/trial\u 1/run\u 1/exp001.tif。图像转到exp100.tif 我想访问: /user/blad

谢谢你的帮助

问题是:

我需要用户根据扩展名选择一个文件,比如.tif。我使用了标准方法,即

[flnm,locn]=uigetfile({'*.tif','Image files'}, 'Select an image');
ext = '.tif';
但我需要从其他子目录获取其他图像文件。假设返回到locn的目录名为:/user/blade/checklist/exp1/trial\u 1/run\u 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.
直到审判

但如果我在/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}));
这真的很难看,我也失去了第一个/。感谢您的帮助


谢谢

首先,像您那样获取文件位置;请注意,我对使用变量ext做了一个小改动

零件有2个信息-所选文件的1个路径;2您需要的工作文件夹路径、清单。所以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循环自动生成试用版和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, '/')

它们是等价的

strjoin(str1, str2, '/')
sprintf('%s/%s', str1, str2)