【问题标题】:Adding cells in an array/vector based on criteria - Matlab根据标准在数组/向量中添加单元格 - Matlab
【发布时间】:2014-05-24 23:47:15
【问题描述】:

我有一个数据向量448X2,其中第一列对应于距离(从 -50 到 224),第二列包含与每个距离相关的强度。

无论方向如何(正/负),我都需要添加所有距离内的强度。例如,我想添加 1 的间隔。因此,如果在 [-1 1] 距离范围内有 5 个值,我需要添加它们的所有强度。然后,从 [-2 -1] & [1 2] 距离等,等等,...

我首先将数据从 0 缩短到 224

datasort = sortrows(abs(data));

这需要负数的蛋糕。现在我的数据按距离按递增顺序排序,我不知道如何在距离间隔内添加强度。

这些是我的datasort 向量的前 10 行:

0.119865417480469   0.0115106217563152
0.669918060302734   0.356697350740433
0.909893035888672   0.659623980522156
1.45951080322266    1.69302666187286
1.70020294189453    2.30387997627258
2.24539566040039    3.98834538459778
2.49082183837891    4.94714736938477
3.02403259277344    7.16749382019043
3.28177261352539    8.59203147888184
3.79549789428711    11.1872768402100

我想得到这样的结果:

1   1.02780000000000
2   3.99690000000000
3   8.93550000000000
4   26.9468000000000

第一列现在包含从 1 到 224 (1:224) 的离散距离值,第二列包含距离范围内所有强度的总和。

我希望我已经足够清楚了。谢谢

更新:

我认为我可以做到:

datasort(:,1) = round(datasort(:,1));

这给了我(前 10 分),

0   0.0115106217563152
1   0.356697350740433
1   0.659623980522156
1   1.69302666187286
2   2.30387997627258
2   3.98834538459778
2   4.94714736938477
3   7.16749382019043
3   8.59203147888184
4   11.1872768402100

我仍然不知道如何添加相同距离的强度!!!

【问题讨论】:

    标签: arrays matlab sorting add


    【解决方案1】:

    我将首先使用histc 来对数据的第一列进行分箱,然后将histc 返回的索引传递给在第二列上操作的accumarray。请注意,您甚至不需要对数据进行排序即可执行此操作,尽管您仍需要调用 abs 以删除负数。

    >> data = [0.119865417480469   0.0115106217563152
    0.669918060302734   0.356697350740433
    0.909893035888672   0.659623980522156
    1.45951080322266    1.69302666187286
    1.70020294189453    2.30387997627258
    2.24539566040039    3.98834538459778
    2.49082183837891    4.94714736938477
    3.02403259277344    7.16749382019043
    3.28177261352539    8.59203147888184
    3.79549789428711    11.1872768402100]
    
    data =
    
             0.119865417480469        0.0115106217563152
             0.669918060302734         0.356697350740433
             0.909893035888672         0.659623980522156
              1.45951080322266          1.69302666187286
              1.70020294189453          2.30387997627258
              2.24539566040039          3.98834538459778
              2.49082183837891          4.94714736938477
              3.02403259277344          7.16749382019043
              3.28177261352539          8.59203147888184
              3.79549789428711            11.18727684021
    
    >> [~, idx] = histc(data(:,1), [0:224]) 
    
    idx =
    
         1
         1
         1
         2
         2
         3
         3
         4
         4
         4
    
    >> result = accumarray(idx, data(:,2))
    
    result =
    
               1.0278319530189
              3.99690663814544
              8.93549275398255
              26.9468021392823
    
    >> 
    

    希望有帮助!

    编辑:

    只是为了确认这确实有效,无需对您的数据进行排序

    >> % Unsort your data snippet to illustrate
    >> data = data([randperm(length(data))],:)
    
    data =
    
              3.79549789428711            11.18727684021
              1.45951080322266          1.69302666187286
             0.909893035888672         0.659623980522156
              2.24539566040039          3.98834538459778
              1.70020294189453          2.30387997627258
             0.119865417480469        0.0115106217563152
             0.669918060302734         0.356697350740433
              3.28177261352539          8.59203147888184
              3.02403259277344          7.16749382019043
              2.49082183837891          4.94714736938477
    
    >> [~, idx] = histc(data(:,1), [0:224])
    
    idx =
    
         4
         2
         1
         3
         2
         1
         1
         4
         4
         3
    
    >> result = accumarray(idx, data(:,2))
    
    result =
    
               1.0278319530189
              3.99690663814544
              8.93549275398255
              26.9468021392823
    
    >>
    

    【讨论】:

      【解决方案2】:

      这是一种方法:

      datasort = sortrows(abs(data));
      datasort(:,1) = 1+floor(datasort(:,1));
      inSum=zeros(1,max(datasort(:,1)));
      for i=1:max(datasort(:,1))
          inSum(i)=sum(datasort(i==datasort(:,1),2));
      end
      

      【讨论】:

        【解决方案3】:

        您可以使用逻辑索引从矩阵中提取这些行,然后对第 2 列求和。

        m = floor(min(x(:,1)));
        M = floor(max(x(:,1)));
        for i = m:M 
           sum(x(x(:,1)=>i & x(:,1)<=i+1, 2));
        end
        

        【讨论】:

          【解决方案4】:

          accumarray 可以在一行中做到这一点:

          result = accumarray(ceil(datasort(:,1)), datasort(:,2));
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2012-10-12
            • 1970-01-01
            • 2021-10-27
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多