嵌套结构字段的大小和有效的数据提取

时间:2014-05-29 14:33:21

标签: matlab

我想使用类似于下面代码的结构来存储多个测量数据(元数据和值)。

  1. 有没有办法从矢量中的所有3个测量值中获取Data.CHANNEL字段的第1列的大小 - 或执行length(STRUCTURE(1).Data.CHANNEL(:,1))之类的操作 - 而不运行for循环?
  2. 同样,那些数据列(1xN)可以提取到临时(3xN)(单元)数组吗?
  3. 感谢您的帮助!

       % Example Data
        x1= (1:100);
        x2= (1:105);
        x3= (1:99);
        % Fill structure usually over results(i) in a for loop
        STRUCTURE = struct;
        STRUCTURE(1).Title = 'NAME 1';
        STRUCTURE(1).Data.CHANNEL = repmat(x1, 3, 1)';
        STRUCTURE(2).Title = 'NAME 2';
        STRUCTURE(2).Data.CHANNEL = repmat(x2, 3, 1)';
        STRUCTURE(3).Title = 'NAME 3';
        STRUCTURE(3).Data.CHANNEL = repmat(x3, 3, 1)';
        save('STRUCTUREFILE','STRUCTURE')
        S=load('STRUCTUREFILE.mat');
        % How to get e.g all lengths / sizes of the first Channel for all three STRUCTURES         (measurements)?
        S.STRUCTURE(1).Data.CHANNEL(:,1)
    

2 个答案:

答案 0 :(得分:0)

这个问题可以解决你的问题。

data_subfield={(STRUCTURE.Data.CHANNEL)};
data_field_size=cellfun(@(x) size(x),data_subfield,'UniformOutput',0)

简单示例:

CODE:

a(1).data=[10,20,30];
a(2).data=30;
a(3).data=[1,20];

zzz=cellfun(@(x) length(x),{(a.data)},'UniformOutput',0)

输出:

zzz = 

    [3]    [1]    [2]

答案 1 :(得分:0)

@ASantosRibeiro说对了。这是另一种方法,也回答了第二个问题。

data = struct2cell(S.STRUCTURE);

% // Extract the CHANNEL components only
dataChannel = [data(2:2:numel(data))];
dataChannelStruct = cell2mat(dataChannel);

% // Question #1
lengthOfEach = arrayfun(@(x) size(x.CHANNEL, 1), dataChannelStruct);

% // Question #2
firstColumnOfEach = arrayfun(@(x) x.CHANNEL(:,1), dataChannelStruct, 'UniformOutput', false);

按照你的例子,最后两行的输出是:

lengthOfEach =

   100   105    99

firstColumnOfEach = 

    [100x1 double]    [105x1 double]    [99x1 double]

注意:这假设Title是第一个,后面是Data.CHANNEL。如果您颠倒顺序,或者在结构中添加任何其他内容,则代码将无效。