2012-10-10 47 views
1

我正在嘗試加載大量的MATLAB文件,這些文件都包含相同的變量以便生成所有值的矩陣。以字母數字順序加載MATLAB .mat文件

這些文件都以一個數字(即40_analysed.mat)開頭,該數字以前是使用正則表達式從不同的原始數據文件中提取的,這意味着我有一個由所有單個數字(id)組成的向量。

當我嘗試使用下面的代碼加載數值並在單個矩陣中顯示所有個人的數據時,文件不會以字母數字方式加載(即根據id),而是顯示爲隨機加載。

file = dir('*_analysed.mat'); 
for i=1:length(id); 
    load(file(i).name,'means'); 
    overallThresholds{i} = means; 
end 
overallMeans = cell2mat(overallThresholds) 

我怎麼能做到這一點,所以得到的矩陣會按正確的順序?道歉,如果這個問題沒有多大意義,這個問題有點難以闡明!

+3

您的數字是否合理?排序字符串/文件名時,請記住07出現在* 11之前,但7出現在* 11之後。 – FakeDIY

+0

什麼是您的操作系統?有一種使用Linux和'bash'的解決方案。 – Yamaneko

+0

OSX,所以'bash'解決方案是可行的。它比下面的方法更簡單嗎? – luser

回答

1

如果你的文件名不具有固定精度數(如@FakeDIY指出,這將意味着他們已經被排序),你可以做這樣的事情:

file = dir('*_analysed.mat'); 
overalThresholds = cell(1, length(id)); 
IDs = zeros(1, length(id)); 
for i = 1:length(id) 
    fileName = file(i).name; 
    IDs(i) = str2double(strrep(fileName, '_analysed.mat', '')); 
    data  = load(fileName, 'means'); 
    overallThresholds{i} = data.means; 
end 
[~, reordering] = sort(IDs); 
overallThresholds = overallThresholds(reordering); 

換句話說,將文件ID存儲在單獨的陣列中,然後使用第二個輸出SORT將overallThresholds重新排列爲ID的排序順序。我也預先分配了數組,並使用LOAD的函數形式,但您並不需要這樣做)。

+0

這種方法奏效,非常感謝。我一定會使用固定精度的數字來防止將來出現這個問題。 – luser

1

當使用dir命令時,不承諾結果將按字母順序排列。實際上,manual明確表示:

dir列出了MATLAB當前文件夾中的文件和文件夾。結果 按操作系統返回的順序出現。

即使你確實按字母順序得到了這個,沒有什麼能保證你下一次得到它。因此,您必須使用sort命令來命令dir的結果。

[~,order] = sort({file.name}); 
    file = file(order); 
+0

正確的解決方案。請注意操作系統可以在不考慮大寫字母的情況下訂購 - 因此您獲得的訂單與您的操作系統不一樣。在這種情況下。 - >以防萬一http://www.mathworks.fr/fr/help/matlab/ref/lower.html –