MATLAB:组合具有相似值的行

时间:2015-10-28 23:08:01

标签: matlab

我是MATLAB的新手,我正在尝试组合具有相似值的行(我有数千行),例如

1   NaN

1   NaN

1   NaN

2   9

2   26.5

2   21.5

2   18

2   24.5

2   12

2   22.5

3   NaN

3   NaN

3   NaN

3   NaN

4   18.5

4   22

4   35.5

... ... ...

1   NaN     NaN     NaN             

2   9       26.5    21.5    18      24.5    12  22.5

3   NaN     NaN     NaN     NaN         

4   18.5    22      35.5        

任何人都可以帮我这个吗?

1 个答案:

答案 0 :(得分:1)

使用普通数组无法做到这一点。每行必须具有相同数量的列,但您所需的输出不是这样。如果您愿意,可以使用单元格数组。

如果单元格数组是一个选项,解决此IMHO的最佳方法是使用accumarray/sort/cellfun管道。首先使用accumarray将属于同一ID的所有值组合在一起,这样就是您案例中的第一列。因此每个组都是一个单元阵列。但是,accumarray的结果是每组中的值无序。因此,您需要分组的是值的位置。您要对这些位置进行排序,输出的是一个单元格数组,其中每个单元格都是您在原始数据中访问的索引列表。

然后调用cellfun作为使用索引访问实际数据本身的最后一步。

假设您的数据存储在X并且它是一个双列数组,我想到了这样的事情。

ind = (1 : size(X,1)).'; %'
out_ind = accumarray(X(:,1), ind, [], @(x) {sort(x)});
out = cellfun(@(x) X(x,2), out_ind, 'uni', 0);

我们得到:

>> celldisp(out)

out{1} =

   NaN
   NaN
   NaN



out{2} =

    9.0000
   26.5000
   21.5000
   18.0000
   24.5000
   12.0000
   22.5000



out{3} =

   NaN
   NaN
   NaN
   NaN



out{4} =

   18.5000
   22.0000
   35.5000