【问题标题】:How to remove rows from a struct based on a condition?如何根据条件从结构中删除行?
【发布时间】:2021-07-02 13:53:36
【问题描述】:

我想使用一个条件从结构中删除行,如果hsvmean field = 0 然后删除该行。我试过这段代码:

for j =1:length(selectedIms) % the length of selectedIms is 100
    if selectedIms(j).hsvmean == 0
        selectedIms(j)=[];
    end
end

但我收到此错误:

索引超过了数组元素的数量 (73)。

HSVColorSelection 中的错误(第 57 行)
如果 selectedIms(j).hsvmean == 0

如何删除这些项目?

【问题讨论】:

    标签: arrays matlab struct


    【解决方案1】:

    如果有人需要,这里有一个解决方案。创建一个新结构,其中只有过滤后的行

    newSelectedlms = meanValues([meanValues.selected_ims]~= 0);
    

    【讨论】:

      【解决方案2】:

      当你循环遍历元素时,你正在删除元素,使数组更小。您循环的结束索引在循环开始时确定,因此您将索引超出数组的末尾。你也在跳过元素。

      一个简单的解决方案是从后面开始循环:

      for j=length(selectedIms):-1:1
         ...
      end
      

      另一种解决方案是一次删除所有元素。您可以构建要在循环中删除的索引列表,然后在循环后删除这些元素。或者不循环执行:

      selectedIms([selectedIms.hsvmean] == 0) = [];
      

      【讨论】:

      • 嘿@Cris,刚刚看到你的回答,谢谢,我测试了所有三个解决方案,它们都工作正常,我保留了你最后的建议。想到一个问题(一般问题),避免代码中的循环更好吗?我的意思是如果有另一个选项可以在没有循环的情况下进行(不管数据、类型或大小)
      • @Nissrine:代码最重要的质量是可读性(意味着您通过查看它就知道它的作用,并且使以后更容易维护代码)。因此,如果循环可读性更好,请使用它,直到您确定它正在减慢您的程序。如果您的程序运行速度太慢,请使用分析器找出哪些位花费最多的时间,然后尝试改进这些位。通常删除循环以支持“矢量化”代码是有益的,但并非总是如此。这取决于有多少函数调用(这些有开销)以及无循环版本需要多少中间内存。
      • 好吧,这是有道理的。我仍在学习有关 matlab 和一般编码的知识,我被告知(并且也注意到了)循环会减慢程序的速度,这就是为什么我要询问并尝试获得建议和提示:D。谢谢你的建议和澄清:)
      猜你喜欢
      • 2019-07-07
      • 1970-01-01
      • 1970-01-01
      • 2018-06-04
      • 2018-01-11
      • 2018-03-03
      相关资源
      最近更新 更多