所以我有一个包含数千个文件的文件夹,所有文件都有系统的名称。我希望用户能够选择一个文件夹,然后将所有文件名从列表(单元数组)转换为某种树结构。然而,实现如何在Matlab中存储它是我陷入困境的地方。这是我到目前为止所做的:
folder = uigetdir;
files = dir([folder '\*.nii']);
nfiles = length(files);
filez = cell(nfiles, 1);
for file = 1:nfiles
filez(file,:) = cellstr(files(file).name);
end
files = filez;
chars = zeros(nfiles, 1);
for file = 1:nfiles
chars(file) = length(files{file});
end
filez = files;
names = struct;
for file = 1:nfiles
curfil = filez{file};
depth = 0;
for curchar = 1:chars(file)
if curchar == 1
curmatch = strmatch(curfil(1:curchar), filez);
prevmatch = curmatch;
else
prevmatch = curmatch;
curmatch = strmatch(curfil(1:curchar), filez);
end
if length(curmatch) ~= length(prevmatch)
newnamepart = curfil(1:curchar-1);
newstructnamepart = ['X' newnamepart]; %This I did because fieldnames must start with characters
%This is where I dont know how to go on...
end
end
end
因此,对于每个文件名,我检查名称开头的每个部分字符串,其他文件名以相同的字符串开头。如果发生了变化,我会回到一个角色,这应该是我在树中的第一个节点。但是我不知道如何创建这样一棵树。结构对我来说似乎最喜欢这个,但我不知道如何创建这个结构,但也许有另一种方式?
答案 0 :(得分:1)
点子:
您也可以使用containers.Map。 您不能使用struct,因为字段名称必须是常规MATLAB标识符。
function c = group(b, j)
c = {};
ch = '';
for i=1:size(b,1)
if ~strcmp(b(i,j), ch)
ch = b(i,j);
c{end+1} = [];
end
c{end}(end+1,:) = b(i,:);
end
if j<size(b,2)
for k=1:length(c)
c{k} = group(c{k}, j+1);
end
end
end
filenames = ['aba'; 'dab'; 'aaa';'abb'];
b=sortrows(filenames);
group(b,1)
ans =
{
[1,1] =
{
[1,1] =
{
[1,1] = aaa
}
[1,2] =
{
[1,1] = aba
[1,2] = abb
}
}
[1,2] =
{
[1,1] =
{
[1,1] = dab
}
}
}