【问题标题】:MATLAB: Access Data in Nested Structure using For loopMATLAB:使用 For 循环访问嵌套结构中的数据
【发布时间】:2017-10-08 01:30:14
【问题描述】:

早安,

我有一个这种格式的嵌套结构。

Data: [1x1 struct]
    a: [1x1 struct]
        a1: [10x1 double]
        a2: [10x1 double]
        a3: [10x1 double]
    b: [1x1 struct]
        b1: [10x1 double]
        b2: [10x1 double]
    c: [1x1 struct]
        c1: [10x1 double]
        c2: [10x1 double]
        c3: [10x1 double]
        c4: [10x1 double]

abc 的每个子字段都是桶中事件的持续时间百分比。每个桶中元素的数量是数据集的数量。我想对每个数据集的桶值求和,如果它们加起来不等于 100%,则丢弃整个数据集。如何以简单的格式使用 for 循环访问 abc 字段的桶的每个元素Data

编辑:我想出了如何调用子字段及其元素,将百分比和现在相加,如果数据集的总和不超过 100,则需要从每个子字段中完全删除字段。

field = fieldnames(Data);
for group = 1:length(field)
    for subfield = fieldnames(Data.(field{group}))

        fieldSize = structfun(@(field) length(field),Data.(field{group}));
        nb_datasets = fieldSize(1,1);

        for jj = 1:nb_datasets
            for ii = 1:length(subfield)
                a_dataset_pcts(jj,ii) = Data.(field{group}).(subfield{ii})(jj,1);
            end
            a_pct_total(jj,:) = sum(a_dataset_pcts(jj,:));
        end

    end
end

【问题讨论】:

  • 你自己有没有尝试过?
  • 喜欢用@(field) mean(field)替换@(field) length(field)
  • @Mad Physicist 重申我上面的问题:a1、a2、a3 是 a 组的百分比桶。我想知道如何访问这些存储桶元素中的每一个,以便以后可以执行多个任务(平均值只是一个示例)。桶中元素的数量是数据集的数量。桶元素表示事件的百分比,a1(1,1)、a2(1,1)、a3(1,1) 的总和应为 100%。如果它们的总和没有达到 100%,则后续的其他任务应该是删除整个数据集。
  • 我理解了这个问题。你有什么尝试解决它。您知道for 循环是一种可能的解决方案。例如,我们能否看到您尝试编写的 for 循环?
  • @Mad Physicist 我想我明白了,我不确定如何将子字段定义为 Data.(field{1}) ... 不是最好的编码风格,但它可以工作。

标签: matlab for-loop struct nested field


【解决方案1】:

Matlab 之类的矩阵 Bensa....您应该现在放弃您的方法。

固定大小的数据集

如果所有abc 数组的大小均为10x1,则应立即切换到数组单元,作为持续时间和数组列的索引每个持续时间的数据集:

a: [1x1 cell]
    a{1}: [10xna double]
    a{2}: [10xnb double]
    a{3}: [10xnc double]

所有统计数据都很容易。您有两个 for 循环,一个用于持续时间,另一个用于数据集。 Matlab 将每个数据集中的函数向量化(大部分时间)。在这里,我假设max(.) 是您用于获取统计信息的聚合数组函数:

n=length(a);
for i=1:n
    ni=size(a{i},2);
    for j=1:ni
        max(a{i})
        mean(a{i}')'
        if j==j0 && i==i0
            a{i}(:,j)=[];  % Cleanup j0th event in i0th dataset
        end
    end
end

你需要比较a.a1 & b.b1 & c.c1吗?如果这是真的,那么您应该强制创建辅助数组x,然后获取您的统计信息:

for i=1:n
    x(:,i)=a{i};
end
max(x')'

可变大小数据集

如果abc数组每次都不同,那么你升级最后一个数据并切换到一个cell of cells

a{1}: [1xna cell]
    a{1,1}: [la(1)x1 double]
    ...
    a{1,na}: [la(na)x1 double]
a{2}: [1xnb cell]
    ...
a{3}: [1xnc cell]
    ...

在这里max(.')' 方法是没有用的,因为每个数据集的长度可能不同。如果是这种情况,您仍然可以像往常一样通过列引用数据:

n=length(a);
for i=1:n
    ni(i)=size(a{i},2);
    for j=1:ni(i)
        li=length(a{i,j})   % Length of each dataset
        max(a{i,j})
        % mean(a{i}')'      % This do not work anymore
        if j==j0 && i==i0
            a{i,j}=[];      % Cleanup j0th event in i0th dataset
        end
    end
end

这有意义吗?欢迎在下方发表评论...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-15
    • 1970-01-01
    • 1970-01-01
    • 2014-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-17
    相关资源
    最近更新 更多