2013-06-12 86 views
-1

我想在matlab腳本中創建一個帶有變量名稱的結構。這個想法是提取用戶填充的輸入字符串的一部分,並創建一個具有該名稱的結構。例如:Matlab:結構的動態名稱

CompleteCaseName = input('s'); 
USER WRITES '2013-06-12_test001_blabla'; 
CompleteCaseName = '2013-06-12_test001_blabla' 
casename(12:18) = struct('x','y','z'); 

在這個例子中,casename(12:18)給我的結果test001

我想這樣做可以讓我輕鬆地比較兩個案例,通過連續導入每個案例的結果。所以,我可以寫,例如:

plot(test001.x,test001.y,test002.x,test002.y); 

的問題是,該線casename(12時18分)=結構( 'X', 'Y', 'Z');對於Matlab來說,是無效的,因爲它使我將一個字符串更改爲一個結構體。所有我找實例與結構是基於一個定義,就像

S = struct('x','y','z'); 

而且我不能找到一種方法,使一個動態名稱小號基於字符串。

我希望有人能理解我寫的東西:)我檢查了FAQ和Google,但是我無法找到同樣的問題。

+0

如果您有100次測試,該怎麼辦?你會硬編碼plot(test001.x,...,test100.y)嗎?相反,使用單元陣列或結構例如's.test001.data'或更好的矩陣,如果長度重合。 – Oleg

回答

0

使用具有動態字段名稱的結構。

例如,

mydata.(casename(12:18)) = struct; 

會給你一個結構mydata與現場test001

您可以再後來你xyz字段添加到這一點。

您可以稍後使用字段mydata.test001.xmydata.(casename(12:18)).x

如果可能,儘量遠離使用eval,如另一個答案所示。它使調試東西很困難,而且給出的實例中存在,這直接eval的用戶輸入:

eval('%s = struct(''x'',''y'',''z'');',casename(12:18)); 

甚至一個安全風險 - 會發生什麼,如果在字符串中的用戶類型,在所選擇的字符system(''rm -r /''); a?有什麼不好的,就是這樣。

+0

我會用這個解決方案。我沒想過要根據動態名稱測試字段並在之後添加字段。謝謝,我幾乎放棄了我的想法。 – Lalylulelo

+0

@Lalylulelo,如果答案解決了您的問題,請使用左側的勾號按鈕將其標記爲已接受,因爲它可以幫助其他用戶在他們有類似問題時找到答案。 –

-2

使用eval:

eval(sprintf('%s = struct(''x'',''y'',''z'');',casename(12:18))); 

編輯:道歉,忘了sprintf的。

+0

我會一直低調'eval()'解決方案,將變量彈出到工作區中。 – Oleg

+0

因爲它不安全?確實如此,但它是一個現有問題的有效答案。當然,有更好的方法去做。 –

+1

不,只是因爲無經驗的用戶傾向於濫用'eval()'。他們習慣了錯誤的數據管理實踐(編程方法),最終使他們回到論壇,提出難以理解的問題和非建設性的問題。因此,我對'eval()'的低估往往會在用戶深入構建腳本之前對這些方法發出警告。根據我對OP的評論,在評估這樣的結構之後,下一步將是評估'plot()'命令等。 – Oleg

0

正如我已經評論說,在最好的情況下是當你所有的xy向量具有相同的長度。在這種情況下,您可以將來自不同文件的所有數據存儲到2個矩陣中,並調用plot(x,y)將每列作爲一系列圖。

備選地,可以使用一個單元陣列使得:

c = cell(2,nufiles); 
for ii = 1:numfiles 
    c{1,ii} = import x data from file ii 
    c{2,ii} = import y data from file ii 
end 
plot(c{:}) 

的結構,另一方面

s.('test001').x = ... 
s.('test001').y = ... 
+0

當我爲其他答案寫作時,動態字段名稱的想法肯定會起作用。謝謝你,回答。我永遠不會使用eval()! – Lalylulelo