MATLAB:在结构中存储值

时间:2017-04-04 15:12:55

标签: matlab for-loop field matlab-struct

美好的一天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中的数组中{1}}结构。

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中的变量名称不会调出结构值。

非常感谢,

1 个答案:

答案 0 :(得分: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