2013-11-21 69 views
0

我試圖導入多個數據文件,稱爲1min1,1min2,1min3,1min4等。他們將進行一些處理(減去某些列,乘以某些值等)和最終結果文件是一列。我希望matlab將每個這些列保存在一個與文件名相同的變量中。 因此,在進行多個文件1min1,1min2,1min3,1min4等時,出現幾個同名的變量,但只有一個列/變量。基於文件名的變量

我嘗試使用此:

i=20; %nr of files 
name='1min'; %basic filename 
norm=8;  %normalisation factor 

for k=1:i 
    fileName = strcat(name,num2str(k)); 
    A= load(fileName); 
    [thisshouldbethesamefilename]=(A(:,7)-A(:,6))/A(1,12)*norm; 
end 

最後,我想使這個功能,我只輸入文件名,文件和歸一化因子的NR,和它給了我所得到的列作爲單獨的變量。我知道我可以將所有列放在同一個文件中(例如使用B(:,1),B(:,2)等),但我想看到原始文件名,所以我知道數據的來源。 我試過genvarname,eval和類似的東西,但沒有成功的幾件事情。可能是簡單的東西,幫助表示讚賞!

+0

可能我不明白爲什麼你不能做到這一點與'eval',但是你爲什麼要_want_?改爲使用單元格數組,並存儲文件名以供參考。可能使用'containers.Map'類,如果你想花哨,並允許查找基於文件名。 – chappjc

+0

我同意,它應該是可能與eval,該功能總是困惑了我很多,我似乎從來沒有能夠得到它的工作:\ 至於爲什麼我想要它,如果我使用單元格數組並存儲文件名字作爲參考,我仍然必須查找這些東西。 (這是懶惰的,還是不切實際的?)如果我知道我必須繪製1min5度量的數據,我只想使用變量1min5 :) – SvB

回答

2

使用eval應該可以正常工作。試試這個:

temp =(A(:,7)-A(:,6))/A(1,12)*norm; 
eval([ 'file_' name ' = temp;']) 

請注意,這將在所有變量名前面加上「file_」。這對你的任務很重要,因爲你的文件名以一個數字開頭(「1min」),它不會被識別爲有效的MATLAB變量。換句話說,如果你剛剛寫了

1min = 12 

... MATLAB會拋出一個錯誤。

+0

我很驚訝這裏的響應時間。謝謝,這似乎已經做到了。將來,我會記住不要在開始時輸入數字! – SvB

+1

這個解決方案是完全正確的,但有一些很好的理由可以避免評估。 (http://www.mathworks.de/de/help/matlab/matlab_prog/string-evaluation.html) – Daniel

1

我建議使用map container

i=20; %nr of files 
name='1min'; %basic filename 
norm=8;  %normalisation factor 
map = containers.Map() 
for k=1:i 
    fileName = strcat(name,num2str(k)); 
    A= load(fileName); 
    map(fileName)=(A(:,7)-A(:,6))/A(1,12)*norm; 
end 

讀取數據通過

map(fileName) 
+1

優秀的建議。 ;) – chappjc

+1

請注意,您可以使用'map.keys'從地圖中獲取完整的文件名列表。 – chappjc

+0

從來沒有聽說過地圖容器,但它看起來不錯!謝謝你。 – SvB