2017-05-31 26 views
0

我正在研究一個matlab腳本,它通過一個目錄遞歸循環並試圖找到某個類型的所有文件。我使用一個數組作爲一種堆棧。Matlab下標指數錯誤,完全交互運行

dirstack{end + 1} = filesInCurrentDir(i); 

失敗。但是,如果我使用dbstop if error並且手動運行完全相同的行,它可以正常工作。

如果我預先指定的索引length(dirstack) + 1

是否有一個原因,這不會在腳本環境中工作,但它會在一個互動的環境中它也失敗了呢?

最低工作例如:

DIR='.'; 
dirstack{1} = DIR; 
while length(dirstack) ~= 0 %loop while there's still directories to look for 
    curdir = dirstack{1}; %the working directory is popped off the top of the stack 
    dirstack{1} = []; %delete the top element, finishing the pop operation 
    filesInCurrentDir = dir(curdir); 
    for i=3:length(filesInCurrentDir) % start at 3, dir returns 1:. 2:.. and we don't want those 
     if filesInCurrentDir(i).isdir; %if this is a directory 
      dirstack{end+1} = filesInCurrentDir(i); 
     elseif strcmp(filesInCurrentDir(i).name(end+[-3:0], '.jpg')) == 1 %if it's a psdata file 
      files{end+1} = [curdir, filesep, filesInCurrentDir(i_.name)]; 
     end 
    end 

end 

回答

0

這是我怎麼會得到當前文件夾下的所有.jpg文件夾及其子:

dirs = genpath(pwd); % dir with subfolders 
dirs = strsplit(dirs, pathsep); % in cellstr for each dir 
files = {}; 
for i = 1:numel(dirs) 
    curdir = [dirs{i} filesep]; 
    foo = dir([curdir '*.jpg']); % all jpg files 
    foo([foo.isdir]) = []; % just in case .jpg is folder name 
    foo = strcat(curdir, {foo.name}); % full file names 
    files = [files foo]; % cell growing 
end 

現在回到你的問題。代碼中有幾處錯誤。您可以比較我更正的代碼,並檢查我的意見在代碼中:

dirstack = {pwd}; % ensure init dirstack to current dir 
files = {}; 
while length(dirstack) ~= 0 % better ~isempty(dirstack) 
    curdir = dirstack{1}; 
    dirstack(1) = []; % dirstack{1} = [] sets first cell to [], wont remove the cell as you want 
    filesInCurrentDir = dir(curdir); 
    for i=3:length(filesInCurrentDir) % this works for Windows, but may not be safe to always skip first two 
     if filesInCurrentDir(i).isdir 
      dirstack{end+1} = filesInCurrentDir(i); 
     elseif strcmp(filesInCurrentDir(i).name(end+[-3:0]), '.jpg') == 1 % had error here 
      files{end+1} = [curdir, filesep, filesInCurrentDir(i).name]; % had error here 
     end 
    end 

end 
+0

謝謝,我會嘗試新的方法。我仍然不明白爲什麼我有原始問題?特別是因爲確切的線路正確地交互式運行,並且看起來您沒有發現任何問題? –

+0

我解釋了代碼註釋中的錯誤。一個主要錯誤是在移除單元格元素時使用dirstack(1)而不是dirstack {1}。其他就像語法錯誤或錯字(我標記爲「有錯誤在這裏」)。錯誤消息可能是由於語法錯誤。所以我不相信你最小的例子是一行一行的。 –