【问题标题】:Finding an element of a structure based on a field value根据字段值查找结构的元素
【发布时间】:2016-06-21 00:05:02
【问题描述】:

我有一个包含大量字段的 1x10 结构数组,我想从结构数组中删除其中一个字段变量具有特定值的元素。 我知道我正在寻找的值和我应该寻找的字段,我也知道一旦我找到它,如何从结构数组中删除元素。问题是如何(如果可能)优雅地识别它而不通过暴力解决方案,即通过结构数组的元素与我正在寻找的值进行比较的 for 循环。 示例代码:买家为 1x10 结构数组,包含字段: id,n,预算 以及要在 id 值中找到的变量,例如 id_test = 12

【问题讨论】:

    标签: arrays matlab structure matlab-struct


    【解决方案1】:

    如果你有一个structs 的数组,并且你使用点引用,你可以使用这个事实,这将创建一个comma-separated list。如果您将其包含在[] 中,它将尝试创建一个数组,如果您将其包含在{} 中,它将被强制转换为一个单元格数组。

    a(1).value = 1;
    a(2).value = 2;
    a(3).value = 3;
    
    % Into an array
    [a.value]
    
    %   1   2   3
    
    % Into a cell array
    {a.value}
    
    %   [1]     [2]     [3]
    

    所以要进行比较,您可以将您关心的字段转换为单元数组的数组来进行比较。然后,此比较将产生一个逻辑数组,您可以使用它来索引原始结构。

    例如

    % Some example data
    s = struct('id', {1, 2, 3}, 'n', {'a', 'b', 'c'}, 'Budget', {100, 200, 300});
    
    % Remove all entries with id == 2
    s = s([s.id] ~= 2);
    
    % Remove entries that have an id of 2 or 3
    s = s(~ismember([s.id], [2 3]));
    
    % Find ones with an `n` of 'a' (uses a cell array since it's strings)
    s = s(ismember({s.id}, 'a'));
    

    【讨论】:

    • 这正是我想要的!一个单行代码,不仅可以识别我需要通过其中一个字段删除的元素,还可以将其删除。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-05
    • 1970-01-01
    • 2015-12-23
    • 1970-01-01
    • 2021-03-04
    • 2016-01-15
    相关资源
    最近更新 更多