2014-09-19 99 views
1

我的問題如下:迭代了很多結構

我給出了大約300個Struct文件。 他們建立這樣的:

DSC_0001中有大約250其他結構文件: - >是這樣的:DSC_0001.marker_1 並在它這其中有10個號碼。 就像是: DSC_0001.marker_1.flow_angle = 90

,現在我想通過所有的文件結構迭代 類似的東西:

for i = 1:300 
    for j = 1:250 
     flow_angle = DSC_**i**.marker_**j** 
    end 
end 

有沒有辦法做到這一點? 我有這樣的感覺,它可能很容易,但我找不到解決方案... 我希望我的問題已經夠清楚了...

感謝您的幫助!

回答

2

儘量不要使用eval。

這取決於您的數據如何存儲,但有一種可能性是它在.mat文件中。在這種情況下,它可以使用

DSC_structs = load('My_DSC_struct_file.mat'); 

被加載,然後可以訪問像這樣的價值觀:

for i = 1:300 
    for j = 1:250 
     flow_angle(i,j) = DSC_structs.(['DSC_' sprintf('%04d',i)]).(['marker_' sprintf('%d',j)]); 
    end 
end 

Why avoid the eval function

編輯:你說的每個結構是不同的文件。這有點混亂。我可能會做這樣的事情來加載它們:

DSC_structs = cell(1,300); 
for i = 1:300 
    %Note: I'm guess at your file names here 
    DSC_structs{i} = load(['DSC_' sprintf('%04d',i) '.mat']; 
end 

,然後訪問值

DSC_structs{i}.(['DSC_' sprintf('%04d',i)]).(['marker_' sprintf('%d',j)]); 
+0

它被保存在很多墊文件...每個結構新的一個...... – Bant 2014-09-19 13:53:36

+0

我添加了一個編輯多個文件 – ioums 2014-09-19 14:16:55

+0

謝謝你的作品太棒了! – Bant 2014-09-19 15:06:36

0

我想這是一個用例可怕eval功能:

for i = 1:300 
    for j = 1:250 
     eval (['flow_angle = DSC_', sprintf('%04d',i), '.marker_', num2str(j)]); 
    end 
end 

NB有2個問題,我上面的代碼

  1. 你還沒告訴我們你想存儲你的角度,所以我的代碼沒有:/但你想要這樣的東西,如果你只是想將它們存儲在矩陣中:eval (['flow_angle(', num2str(i), ',', num2str(j), ') = DSC_', sprintf('%04d',i), '.marker_', num2str(j)])
  2. eval是一種可怕的做事方式,但是你不得不因爲某人將你的數據保存在一個可怕的東西中。通過以更智能的方式重新保存數據,將自己排除在未來之外!所以像這樣:

for i = 1:300 
    eval (['DSC(', num2str(i), ') = DSC_', sprintf('%04d',i)]); 
end 
%// then save DCS! 

現在你可以通過這個矩陣結構的循環,而不是一個300層結構污染你的工作空間,並迫使你使用eval

+0

非常感謝! eval正在工作!我想將它們存儲在矩陣flow_angle(i,j)中...爲什麼eval可怕?它很慢嗎? – Bant 2014-09-19 13:02:15

+0

@嚴肅的工作和調試是一項艱鉅的任務。很難讀寫代碼等。我真的建議你以更好的格式保存你的數據,這樣你就可以在未來避免eval – Dan 2014-09-19 13:19:23

+0

@Bant也請閱讀ioums的答案,這是一個更好的選擇 – Dan 2014-09-19 13:22:17