【问题标题】:How can I find the last element amongst a set of grouping variables?如何在一组分组变量中找到最后一个元素?
【发布时间】:2015-02-11 17:10:19
【问题描述】:

我有一个 150x2 矩阵,其中第一列包含可被视为“分组变量”的数字,第二列包含与这些分组变量相关的值。所以一个小的 12x2 版本看起来像这样

 200741 5441
 200741 5524
 200741 5428
 200742 5670
 200742 5668
 200742 5559
 200742 5215
 200743 5184
 200743 5473
 200743 5496
 200743 5568
 200743 5702

我想找到与每个分组变量关联的值的最后一个值。因此,上面的示例将产生 5428 的最后一个元素(用于变量 200741)、5215 的最后一个元素(用于变量 200742)和 5702 的最后一个元素(用于分组变量 200743)。在 coumn1 中找到分组变量的唯一值后,如何获取 column2 中与每个分组变量对应的最后一个元素?在 Matlab 中怎么能做到这一点?

【问题讨论】:

  • 只是好奇 - 这里发布的任何解决方案对您有用吗?

标签: matlab


【解决方案1】:

如果第一列是排序的并且包含正整数,你可以使用accumarray(诚然有点拉伸):

result = nonzeros(accumarray(A(:,1), A(:,2), [], @(x) x(end), 0, true));

注意事项:

  • 排序要求源于这样一个事实,根据documentation

    如果subs 中的下标没有根据它们的线性索引进行排序,那么accumarray 在将它们传递给fun 时可能不会始终保持val 中数据的顺序

    所以@(x) x(end) 不会总是给出 last 元素。

  • accumarray(第五个参数true)的稀疏版本用于分组值很大的情况(如示例中所示)。

【讨论】:

  • @Divakar 关键是@(x) x(end)(连同引用的注释):从每个组中取出最后一个元素。但是,是的,我强迫了一些事情。你们留下了很好的答案! :-)
  • 嗯,现在有点道理!
【解决方案2】:

您可以使用unique 为您提供数字第一次或最后一次出现的位置;根据版本,您可能需要使用 legacy 选项来确保它返回 last 索引:

[B,ind,~] = unique(A(:,1),'last','legacy');
out = A(ind,2);

【讨论】:

  • 我正要推荐这个!
  • 什么,不是bsxfun? ;) 我的印象是 OP 无论如何都会从第一列中提取 unique 值,还不如选择两个。
  • @nkjt accumarray 会吗? :-)
【解决方案3】:

这可能是一种方法,假设 A 作为输入数组 -

%// Sort the input matrix based on the column -1 values, 
%// just for cases when the "grouping variables" are not already sorted
A = sortrows(A,1)

%// Use diff to find out the row indices where "groups" switch
%// to give us the last row indices for each "grouping", which
%// could be used to index into second column of A for final output
out = A([diff(A(:,1))~=0 ; true],2)

【讨论】:

    【解决方案4】:

    假设矩阵按分组数字排序,如示例所示,要获得布尔索引,您可以执行以下操作: 给定你的矩阵是a

    I=a(1:end-1, 1) ~= a(2:end, 1)
    

    它将在与最后一个“分组”数字对应的索引上存储布尔值,最后一个除外。 因此,要获得您想要的行,只需执行a(I, :)。并且不要忘记最后的结果。 或者,作为单行:

    [a( a(1:end-1, 1) ~= a(2:end, 1), : ); a(end, :)]
    

    【讨论】:

    • 您或许应该指出这假设矩阵是根据第一列排序的
    • @LuisMendo 完成了,虽然没有太多谈论“最后一个”值的意义,如果没有排序的话。
    • 考虑例如[10 1; 10 2; 20 5; 10 4]。最后一个值为4(对于10)和5(对于20)。矩阵未排序
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-06-14
    • 1970-01-01
    • 2013-04-11
    • 1970-01-01
    • 2013-07-27
    • 2018-08-25
    • 1970-01-01
    相关资源
    最近更新 更多