MATLAB:在结构中存储值
MATLAB: Storing values in a structure
日安,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
结构中,但是我想做的是对于每个循环,将单个值保存到 [=13 中的数组中=]结构。
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
应该如下所示:
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 中的变量名称不会调出结构值。
非常感谢,
目前还不清楚您的代码的哪一部分实际上正在创建您的数据结构。有几种方法可以从您的变量名称数组创建 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
数组.您应该能够使用 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
日安,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
结构中,但是我想做的是对于每个循环,将单个值保存到 [=13 中的数组中=]结构。
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
应该如下所示:
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 中的变量名称不会调出结构值。
非常感谢,
目前还不清楚您的代码的哪一部分实际上正在创建您的数据结构。有几种方法可以从您的变量名称数组创建 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
数组.您应该能够使用 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