2012-11-24 60 views
1

我有一個是下面所示的結構:Matlab的:提高樹遍歷代碼

database structure

我有一個包含一個brandsdatabase。每個brandlogoquery組成。 我想遍歷所有database中的所有文件(file_1file_n)並對它們執行一些操作。

我寫了這個代碼:

d = dir(database); 
isub = [d(:).isdir]; 
brandsFolders = {d(isub).name}'; 
brandsFolders(ismember(brandsFolders,{'.','..'})) = []; 
[numberOfBrands not_used]=size(brandsFolders); %holds the number of the brands 
for i=1:numberOfBrands 
    temp=strcat(database, '\'); 
    currentBrand=strcat(temp, brandsFolders(i)); 
    d = dir(currentBrand{1,1}); 
    isub = [d(:).isdir]; 
    logoAndQuery = {d(isub).name}'; 
    logoAndQuery(ismember(logoAndQuery,{'.','..'})) = []; 
    logo=strcat(currentBrand, '\', logoAndQuery(1)); 
    files=dir(logo{1,1}); 
    [numberOfFiles not_used]=size(files); 
    for j=1:numberOfFiles 
     if strcmp(files(j).name, '..')~=1 && strcmp(files(j).name, '.')~=1 
      %operations on each files(j).name 
     end 
    end 
end 

代碼工作正常,它遍歷上所需的文件。然而,代碼有點醜陋和令人困惑。

我想知道如果我能以另一種更好的方式做到這一點?

回答

1

遍歷一組目錄幾乎和你一樣。但是海事組織,有一些事情你可以做更容易/我會做出不同:

brandsFolders = dir(database); 
brandsFolders(~[brandsFolders.isdir] | strcmp({brandsFolders.name},'.') | strcmp({brandsFolders.name},'..')) = []; 

for ii=1:numel(brandsFolders) 
    logoAndQuery = dir(fullfile(database,brandsFolders(ii).name)); 
    logoAndQuery(~[logoAndQuery.isdir] | strcmp({logoAndQuery.name},'.') | strcmp({logoAndQuery.name},'..')) = []; 

    logo = fullfile(databasecurrentBrand,brandsFolders(ii).name), logoAndQuery(1).name); 
    files = dir(logo); 
    files(strcmp({files.name},'.') | strcmp({files.name},'..'))=[]; 

    for jj=1:numel(files) 
     %operations on each files(j).name 
    end 
end 

(當然,這只是工作,如果你確定logoAndQuery(1)永遠是「標誌」目錄)
或或者使用一個子功能爲DIR-查詢:

function dirs = getDirs(strPath) 
    dirs = dir(strPath); 
    dirnames = {dirs.name}; 
    dirs (~[dirs.isdir] | strcmp(dirnames ,'.') | strcmp(dirnames ,'..')) = []; 
end 

,讓你已經有一些短的代碼,並給出了以下,這也是我認爲有在「標誌」目錄沒有目錄:

brandsFolders = getDirs(database); 

for ii=1:numel(brandsFolders) 
    logoAndQuery = getDirs(fullfile(database,brandsFolders(ii).name)); 
    logo = fullfile(databasecurrentBrand,brandsFolders(ii).name), logoAndQuery(1).name); 
    files = dir(logo); 
    files([files.isdir])=[]; 

    for jj=1:numel(files) 
     %operations on each files(j).name 
    end 
end 
+0

太棒了。謝謝 :) ! – Maroun