【问题标题】:MATLAB: combine rows with similar valuesMATLAB:组合具有相似值的行
【发布时间】:2015-10-29 07:36:02
【问题描述】:

我是 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        

谁能帮我解决这个问题?

【问题讨论】:

  • 您确定不只是要删除所有nan 条目吗?假设您将矩阵称为A,使用A(isnan(A))=[]; 很容易做到这一点。 “9 26.5 21.5 18 24.5 12 22.5”几乎没有相似之处,除了它们都是数字,而不是nan。要执行您要求的操作,您需要单元格,在这种情况下,这可能不是您想要的。
  • 普通数组无法做到这一点。每行必须具有相同数量的列,但您想要的输出并非如此。如果您愿意,可以使用元胞数组。请确认这是您想要的,如果是,我们可以处理。
  • rayryeng:如果我可以像前面提到的那样组合,我可以使用元胞数组

标签: matlab


【解决方案1】:

普通数组无法做到这一点。每行必须具有相同数量的列,但您想要的输出并非如此。如果您愿意,可以使用元胞数组。

如果单元格数组是一个选项,那么解决这个问题的最佳方法是使用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

【讨论】:

    猜你喜欢
    • 2018-10-23
    • 1970-01-01
    • 1970-01-01
    • 2021-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-12
    • 1970-01-01
    相关资源
    最近更新 更多