如何找出我的matlab变量存储在哪个结构中?

时间:2018-04-12 14:48:23

标签: matlab matlab-struct

我有.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'命令,但没有走远,因为它只返回工作区中存储的结构的列表。我无法将该文本转换为变量并告诉它搜索所有字段。 谢谢你们/女孩!

1 个答案:

答案 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