我有.mat格式的原始数据。数据由一组标题为“TimeGroup_XX”的结构组成。其中xx只是一个随机数。这些结构中的每一个都包含一堆信号及其相应的时间步长。
它看起来像这样
TimeGroup_45 =
time45: [34069x1 double]
Current_Shunt_5: [34069x1 double]
Voltage_Load_5: [34069x1 double]
这简直无法使用,因为我根本不知道我要查找的变量隐藏在原始数据中包含的100个结构中。我只知道我正在寻找' Current_Shut_3'例如!
必须有一种方法可以让我做以下
for all variables in Work space
I_S3 = Find(Current_Shut_3)
end for
基本上我不想手动点击每个结构来查找我的变量,只是希望它保存在正常的时间序列中,而不是隐藏在随机结构中!关于如何做的任何建议?必须有办法!
我尝试过使用' whos'命令,但没有走远,因为它只返回工作区中存储的结构的列表。我无法将该文本转换为变量并告诉它搜索所有字段。 谢谢你们/女孩!
答案 0 :(得分:4)
这是一个很好的例子,说明为什么当有足够的存储方法不需要代码体操来取回数据时,你不应该迭代变量名。如果你可以改变这一点,那就这样做,甚至不用费心去阅读这个答案的其余部分。
由于所有内容都显然包含在一个*.mat
文件中,因此请将输出指定为load
,以便将其输出到统一结构中并使用fieldnames
进行迭代。
使用以下数据集,例如:
a1.Current_Shunt_1 = 1;
a2.Current_Shunt_2 = 2;
a5.Current_Shunt_5 = 5;
b1.Current_Shunt_5 = 10;
save('test.mat')
我们可以这样做:
% Load data
alldata = load('test.mat');
% Get all structure names
datastructs = fieldnames(alldata);
% Filter out all but aXX structures and iterate through
adata = regexpi(datastructs, 'a\d+', 'Match');
adata = [adata{:}];
queryfield = 'Current_Shunt_5';
querydata = [];
for ii = 1:numel(adata)
tmp = fieldnames(alldata.(adata{ii}));
% See if our query field is present
% If yes, output & break out of loop
test = intersect(queryfield, tmp);
if ~isempty(test)
querydata = alldata.(adata{ii}).(queryfield);
break
end
end
给了我们:
>> querydata
querydata =
5