Arrays 分组运行顺序

Arrays 分组运行顺序,arrays,matlab,matrix,Arrays,Matlab,Matrix,我有一个包含组标识符的矩阵: A = [ 1 ; 1 ; 2;2;2;3;3] 我想通过分组运行序列来增强这一点,以获得如下矩阵: B = [ 1,1 ; 1,2 ; 2,1;2,2;2,3;3,1;3,2] B = 1 1 1 2 2 1 2 2 2 3 3 1 3 2 我如何在不使用可怕的for循环的情况下做到这一点?谢谢大家! 输入包含正整数,不一定是连续的,但已排序 这项工作如下: 创建一个中间逻辑稀疏矩阵,列

我有一个包含组标识符的矩阵:

A = [ 1 ; 1 ; 2;2;2;3;3]
我想通过分组运行序列来增强这一点,以获得如下矩阵:

B = [ 1,1 ; 1,2 ; 2,1;2,2;2,3;3,1;3,2]

B =

 1     1
 1     2
 2     1
 2     2
 2     3
 3     1
 3     2
我如何在不使用可怕的for循环的情况下做到这一点?谢谢大家!

输入包含正整数,不一定是连续的,但已排序 这项工作如下:

  • 创建一个中间逻辑稀疏矩阵,列位置由
    A
    确定,连续行位置:
    sparse(1:numel(A),A,true)
    。虽然这个矩阵可能很大,但将其创建为稀疏矩阵可以提高内存效率
  • 将每列中的
    true
    条目移动到矩阵的上部:
    排序(…,1,'下降')
  • 行索引包含所需的结果:
    [B,~]=find(…)
  • 输入包含正整数,不一定是连续的,也不一定是排序的 这项工作如下:

  • 像以前一样创建一个中间逻辑稀疏矩阵
  • 在每列中,将非零替换为连续值
    1
    2
  • 转换矩阵。线性顺序的非零是期望的结果
  • 输入包含正整数,不一定是连续的,但已排序 这项工作如下:

  • 创建一个中间逻辑稀疏矩阵,列位置由
    A
    确定,连续行位置:
    sparse(1:numel(A),A,true)
    。虽然这个矩阵可能很大,但将其创建为稀疏矩阵可以提高内存效率
  • 将每列中的
    true
    条目移动到矩阵的上部:
    排序(…,1,'下降')
  • 行索引包含所需的结果:
    [B,~]=find(…)
  • 输入包含正整数,不一定是连续的,也不一定是排序的 这项工作如下:

  • 像以前一样创建一个中间逻辑稀疏矩阵
  • 在每列中,将非零替换为连续值
    1
    2
  • 转换矩阵。线性顺序的非零是期望的结果

  • 这适用于非整数

    [s, is] = sort(A)
    [~, d] = cummax(s) ;
    C(is, :) = (2:numel(A) + 1).'  -  d;
    B = [A C] ;
    
    如果输入已排序:

    [~, d] = cummax(A) ;
    C = (2:numel(A) + 1).'  -  d;
    B = [A C] 
    

    这适用于非整数

    [s, is] = sort(A)
    [~, d] = cummax(s) ;
    C(is, :) = (2:numel(A) + 1).'  -  d;
    B = [A C] ;
    
    如果输入已排序:

    [~, d] = cummax(A) ;
    C = (2:numel(A) + 1).'  -  d;
    B = [A C] 
    

    最后一个是
    3,2
    ?@OmG是的,谢谢!如果在运行
    3
    '2之后出现新的
    2
    ,该怎么办?也就是说,
    A=[1;1;2;2;2;3;3;2]
    的输出是什么?即使上述不可能,输入
    A=[2;2;1;1;1;3;3]
    也可能吗?或者
    A=[1;1;4;4;5]
    ?有些方法可能会受益于对输入进行排序,或者没有间隙,或者每个值没有一次以上的运行。请说明这些限制是否适用于您的问题可能的副本是最后一个
    3,2
    ?@OmG是的,谢谢!如果在运行
    3
    '2之后出现新的
    2
    ,该怎么办?也就是说,
    A=[1;1;2;2;2;3;3;2]
    的输出是什么?即使上述不可能,输入
    A=[2;2;1;1;1;3;3]
    也可能吗?或者
    A=[1;1;4;4;5]
    ?有些方法可能会受益于对输入进行排序,或者没有间隙,或者每个值没有一次以上的运行。请说明这些限制是否适用于您的问题。与您所述的假设相反,您的方法的可能副本似乎要求对输入矩阵A进行排序。这里它失败了:A=[2;1;2;3;3;1;3]。但没关系,我可以对矩阵进行排序。我还包括了一种稍微不同的方法,它适用于未排序的情况。在我看来,它也适用于不创建完整矩阵的情况,对于大型输入矩阵,速度要快得多。@bonifaz感谢您的更正(我使用
    full
    进行调试,但忘记删除它)。我对其进行了编辑,并添加了一个解释。与您所陈述的假设相反,您的方法似乎要求对输入矩阵A进行排序。这里它失败了:A=[2;1;2;3;3;1;3]。但没关系,我可以对矩阵进行排序。我还包括了一种稍微不同的方法,它适用于未排序的情况。在我看来,它也适用于不创建完整矩阵的情况,对于大型输入矩阵,速度要快得多。@bonifaz感谢您的更正(我使用
    full
    进行调试,但忘记删除它)。我已对其进行了编辑并添加了解释