2012-02-20 37 views
1

我下面舉個例子表達的問題,我試圖解決的類型:在MATLAB創造從結構變量

clear all 
textdata = {'DateTime','St','uSt','Ln','W'}; 
data = rand(365,4); 
Final = struct('data',data,'textdata',{textdata}) 
clear textdata data 

由此看來,Final.data包含對應於最後的標題值.textdata不包括第一個('DateTime'),因此Final.data(:,1)對應於標題'St'...等等。我想要做的是在工作區中爲每個這些向量創建一個變量。所以,我將在工作空間中爲St,uSt,Ln和W創建一個變量,並在Final.data中給出相應的值。

這怎麼辦?

回答

2

直接回答你的問題是使用assignin功能,像這樣(編輯:就像麥克德夫建議11分鐘前):

%Starting with a Final structure containing the data, like this 
Final.textdata = {'DateTime','St','uSt','Ln','W'}; 
Final.data = rand(365,4); 

for ix = 1:4 
    assignin('base',Final.textdata{ix+1}, Final.data(:,ix)); 
end 

不過,我強烈反對使用動態變量名對數據進行編碼喜歡這個。以這種方式開始的代碼通常以充滿長串連接和eval語句的意大利麪代碼結束。更好的方法是使用一個結構,這樣

for ix = 1:4 
    dataValues(Final.textdata{ix+1}) = Final.data(:,ix); 
end 

或者,要得到同樣的結果在單行:

dataValues = cell2struct(num2cell(Final.data,1), Final.textdata(2:end),2) 
+0

偉大的方法,但如上所述,數據最初是在一個結構,所以我如何將這個應用到我的數據(見修改問題),即我如何到文本數據中的不同單元格? – Emma 2012-02-20 15:03:10

+0

查看編輯答案...這是你的意思嗎? – Pursuit 2012-02-20 15:08:50

3

這是否會解決您的問題:

for ii=2:length(textdata) 
     assignin('base',Final.textdata{ii},Final.data(:,ii-1)); 
    end 

讓我知道如果我誤解。

+0

這是什麼樣的我一直在尋找,但我有數據存儲在類似於上述「最終」的結構中(修改後的問題)。 – Emma 2012-02-20 15:02:28