【问题标题】:Remove data from struct bigger than a certain value从结构中删除大于某个值的数据
【发布时间】:2017-03-30 22:35:11
【问题描述】:

我有一个结构,即<1x1 struct>,我正在尝试根据值编辑结构中的一个字段。该字段称为GeoDist_Actual,结构称为GeoDist_str。 GeoDist_Actual 字段是<262792x1 double>,这是我试图使用的代码,以消除大于 1.609344e+05 的值。

i =1;
for i=i:size(GeoDist_str.GeoDist_Actual)
    if GeoDist_str.GeoDist_Actual(i,1 > 1.609344e+05
    GeoDist_str.GeoDist_Acutal(i,1) = [];
    end
end

我将如何附加或更改此代码以使其功能与我的目标相同?我考虑将所有值设置为 0,但我将不得不从这里倒退以取回 GPS 值,进行反向文森特(球形)计算,我想完全摆脱不符合 if 条件的值。

如果我可以缩小问题的范围,请告诉我,并提前感谢您的帮助!

编辑:我注意到当我更改部分时

GeoDist_str.GeoDist_Actual(i,1) = []; 

GeoDist_str.GeoDist_Actual(i,1) = 0;

它实际上并没有解决任何问题,而是没有访问结构“GeoDist_str”中的字段“GeoDist_Actual”,它只是创建了一个值为 0 的镜像字段。

【问题讨论】:

    标签: matlab matlab-struct


    【解决方案1】:

    考虑这个例子:

    % a 10-by-1 vector
    x = [1;2;3;4;5;6;7;8;9;10];
    
    % remove entries where the value is less than five
    x(x<5) = [];
    

    这称为逻辑索引,不需要循环。

    【讨论】:

      【解决方案2】:

      考虑以下简单示例:

      A.a = 1:5;
      
      A = 
      
          a: [1 2 3 4 5]
      

      现在删除所有大于 3 的元素;

      A.a = A.a( ~(A.a > 3) );
      
      A = 
      
          a: [1 2 3]
      

      或者:

      A.a( A.a > 3 ) = []
      

      对于你的情况,它有点笨重:

      GeoDist_str.GeoDist_Actual = ...
      GeoDist_str.GeoDist_Actual( ...
      ~(GeoDist_str.GeoDist_Actual > 1.609344e+05) )
      

      【讨论】:

      • +1 领先我一秒...我想是因为你缩短了变量名 :-)
      • 更具可读性:GeoDist_str.GeoDist_Actual(GeoDist_str.GeoDist_Actual&gt;1.609344e+05) = [];
      • 如果你想对两列数据使用同样的方法并且你有双重依赖怎么办?如在,我有一列中的值的必要范围和第二列中的值的必要范围。这些列的尺寸相同:262792x1
      • 双重依赖是没问题的,问题是,如果之后它们的维度不一样会怎样?我想我宁愿将每个数组存储在一个单独的结构分支中,或者不删除你可以用NaN 替换这些值。更清楚一点。但是没有不同长度的行/列的矩阵
      猜你喜欢
      • 2017-01-04
      • 1970-01-01
      • 1970-01-01
      • 2021-06-30
      • 1970-01-01
      • 2011-02-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多