2017-04-04 79 views
0

日安MATLAB利弊,MATLAB:在結構中存儲的值

我有我的工作區(單值)的變量必須被存儲到執行的每一個循環數組的一個長長的清單。

這裏有一個簡單的例子: 變量在工作區:

a = 1; 
b = 2.2; 
c = 3.4; 
d = [0.5 0.7 1 1.2 1.5]; 
e = [-15 -10 -5 0 5 10 15 20]; 
serial = {'WTZ00151'}; 
model = {'336F'}; 

NameList = {'a';'serial';'model'}; 

1)在這裏,我只保存單個值的變量爲Data結構,但是我想要做的是什麼,每循環,將單個值保存到Data結構中的數組中。

varList = who; 
Data = struct; 

fields = fieldnames(Data, '-full'); 
fieldSizes = structfun(@(field) length(field),Data); 

% removing arrays from structure 
for lst = 1:length(fieldSizes) 
    if fieldSizes(lst) > 1 
     Data = rmfield(Data,fields(lst)); 
    end 
end 

Data = 

     Data: [1x1 struct] 
     a: 1 
     b: 2.2000 
     c: 3.4000 
    index: 10 
    model: {'336F'} 
    serial: {'WTZ00151'} 

所以,如果我在一個循環中運行它,for i = 1:5Data應該是這樣的:

Data = 

     Data: [1x1 struct] 
     a: [1 1 1 1 1] 
     b: [1x5 double] 
     c: [1x5 double] 
    index: [10 10 10 10 10] 
    model: {1x5 cell} 
    serial: {1x5 cell} 

如何編寫代碼for循環任何想法?

2)由於工作空間中有太多變量&我有一長串需要存儲的變量,而不是使用who將所有變量保存到結構中(然後濾除不需要的),我怎麼能使用變量名稱列表(從文本文件導入:NameList)來調出需要存儲的內容?使用NameList中的變量名稱不會調用結構值。

非常感謝,

回答

2

目前還不清楚你的代碼實際上是在創建你的數據結構。有幾種方法可以從您的變量名稱數組中創建struct

一種方法是相關變量保存到一個文件並返回它們加載到一個struct

save('tmp.mat', NameList{:}); 
Data = load('tmp.mat'); 

另一種選擇(不推薦)使用eval

for k = 1:numel(NameList) 
    Data.(NameList{k}) = eval(NameList{k}); 
end 

至於存儲來自多次迭代的數據,我個人建議將數據存儲到陣列struct而不是陣列的struct。你應該能夠給每個Data實例存儲在使用k作爲索引的數組,如下圖所示:

allData(k) = Data; 

如果你決定你真的想陣列的struct,你總是可以把它轉換之後。

fields = fieldnames(allData); 

output = struct(); 

for k = 1:numel(fields) 
    % Try to just concatenate the values together 
    try 
     values = [allData.(fields{k})]; 

    % If that failed, concatenate them within a cell array 
    catch 
     values = {allData.(fields{k})}; 
    end 

    % Store this in a single output struct 
    output.(fields{k}) = values; 
end 
+0

優秀的迴應。非常感謝您的幫助。 – Bensa