2017-04-04 3 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) 여기서, I는 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:5, Data는 다음과 같이해야 다음 for 루프를 코딩하는 방법에 대한

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} 

어떤 아이디어?

2) 작업 공간에 너무 많은 변수가 있으므로 을 사용하여 구조에 모든 변수를 저장하는 대신 저장해야하는 많은 변수 목록을 가지고 있습니다. 그러면 원하지 않는 것을 필터링 할 수 있습니다. 변수 이름 목록을 사용하여 (텍스트 파일에서 가져옴 : NameList) 어떤 것을 저장해야하는지 알려주십시오. NameList의 변수 이름을 사용하면 구조 값이 호출되지 않습니다. 많은 감사

, 그것은 바로 분명하지 않다

답변

2

실제로 데이터 구조를 만드는 코드의 어떤 부분. 변수 이름 배열에서 struct을 만드는 방법에는 여러 가지가 있습니다.

한 가지 방법은 저장 마찬가지로 지금까지 eval

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

를 사용하는 또 다른 옵션 (권장하지 않음) 파일에 관련된 변수를 저장하고 struct

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

에 다시로드하는 것입니다 데이터를 여러 번의 반복에서 얻으려면 struct 배열 대신 배열에 struct의 데이터를 저장하는 것이 좋습니다. 아래 그림과 같이 인덱스로 k를 사용하여 배열의 각 Data 인스턴스를 저장할 수 있어야한다 : 당신이 결정하는 경우

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