Arrays MATLAB删除按顺序重复的行

Arrays MATLAB删除按顺序重复的行,arrays,matlab,matrix,Arrays,Matlab,Matrix,我正在尝试删除按顺序重复的行。我只有两个可能的值,分别是0和1。我有nXm,其中n表示可能的位数,m对于我的问题并不重要。我的目标是找到一个矩阵,它是nX(m-a)。具有按顺序包含重复项的属性的行a。例如: 我的矩阵是: A=[0 1 0 1 0 1; 0 0 0 1 1 1; 0 0 1 0 0 1; 0 1 0 0 1 0; 1 0 0 0 1 0] 我想删除0中按顺序重复的行。在这个问题中,我们假设t是3。所以我想要矩阵,它: B=[0 1 0 1 0 1;

我正在尝试删除按顺序重复的行。我只有两个可能的值,分别是0和1。我有nXm,其中n表示可能的位数,m对于我的问题并不重要。我的目标是找到一个矩阵,它是nX(m-a)。具有按顺序包含重复项的属性的行a。例如:

我的矩阵是:

A=[0 1 0 1 0 1;
   0 0 0 1 1 1;
   0 0 1 0 0 1;
   0 1 0 0 1 0;
   1 0 0 0 1 0]
我想删除0中按顺序重复的行。在这个问题中,我们假设t是3。所以我想要矩阵,它:

B=[0 1 0 1 0 1;
   0 0 1 0 0 1; 
   0 1 0 0 1 0]
删除第2行和第5行


我可能需要使用diff.

,因此您希望删除至少包含
t
零的
A

一行怎么样

B = A(~any(conv2(1,ones(1,t),2*A-1,'valid')==-t, 2),:);
工作原理:

  • A
    转换为双极形式(
    2*A-1
  • 用一系列的
    t
    one(
    conv2(…)
    )卷积每一行
  • 仅保留卷积不包含
    -t
    ~any(…))
    的行。出现
    -t
    表示
    a
    对应行中的
    t
    零序列
  • 要删除至少包含
    t
    行的行,只需将
    -t
    更改为
    t

    B = A(~any(conv2(1,ones(1,t),2*A-1,'valid')==t, 2),:);
    

    因此,您希望删除序列中至少包含
    t
    零的
    A

    一行怎么样

    B = A(~any(conv2(1,ones(1,t),2*A-1,'valid')==-t, 2),:);
    
    工作原理:

  • A
    转换为双极形式(
    2*A-1
  • 用一系列的
    t
    one(
    conv2(…)
    )卷积每一行
  • 仅保留卷积不包含
    -t
    ~any(…))
    的行。出现
    -t
    表示
    a
    对应行中的
    t
    零序列
  • 要删除至少包含
    t
    行的行,只需将
    -t
    更改为
    t

    B = A(~any(conv2(1,ones(1,t),2*A-1,'valid')==t, 2),:);
    

    使用字符串的方法怎么样?这当然不如Luis Mendo的方法,直接处理数值数组,但它的思路有点跳出了框框。这种方法的基础是,我认为每一行的<代码> a <代码>是一个唯一的字符串,并且我可以通过正则表达式搜索每个字符串来生成一个0串。

    A=[0 1 0 1 0 1;
       0 0 0 1 1 1;
       0 0 1 0 0 1;
       0 1 0 0 1 0;
       1 0 0 0 1 0];
    t = 3;
    
    B = sprintfc('%s', char('0' + A));   
    ind = cellfun('isempty', regexp(B, repmat('0', [1 t])));
    B(~ind) = [];
    B = double(char(B) - '0');
    
    我们得到:

    B =
         0     1     0     1     0     1
         0     0     1     0     0     1
         0     1     0     0     1     0
    

    解释
    • 第1行:将矩阵
      A
      的每一行转换为由0和1组成的字符串。每行成为单元数组中的一个单元。这将使用未记录的函数来促进此单元格数组转换

    • 第2行:我用来查找
      t
      长的0字符串。我首先使用创建一个搜索字符串,该字符串满0,并且
      t
      长。之后,我确定此单元格数组中的每一行是否包含此字符序列(即
      000….
      )。该函数帮助我们执行正则表达式,并返回单元格数组中每个单元格的任何匹配位置。或者,您可以将该函数用于更新版本的MATLAB,以加快计算速度,但我选择了
      regexp
      ,以便该解决方案与大多数MATLAB发行版兼容

      继续,regexp/strfind的输出是一个由元素组成的单元格数组,其中每个单元格报告我们找到特定字符串的位置。如果我们有一个匹配项,那么输出中应该至少报告一个位置,因此我检查是否有任何匹配项为空,这意味着这些是我们不想删除的行。为了从
      a
      中删除行,我想将其转换为
      逻辑
      数组,因此这是一个确定空单元格的调用。因此,此行返回一个
      逻辑数组,其中0表示删除该行,1表示不删除该行

    • 第3行:我从第2行取
      逻辑
      数组,然后反转它,因为这才是我们真正想要的。我们使用这个倒排数组来索引单元格数组并删除这些字符串

    • 第4行:输出仍然是一个单元格数组,所以我将其转换回字符数组,最后转换回数字数组


      • 使用字符串的方法如何?这当然不如Luis Mendo的方法,直接处理数值数组,但它的思路有点跳出了框框。这种方法的基础是,我认为每一行的<代码> a <代码>是一个唯一的字符串,并且我可以通过正则表达式搜索每个字符串来生成一个0串。

        A=[0 1 0 1 0 1;
           0 0 0 1 1 1;
           0 0 1 0 0 1;
           0 1 0 0 1 0;
           1 0 0 0 1 0];
        t = 3;
        
        B = sprintfc('%s', char('0' + A));   
        ind = cellfun('isempty', regexp(B, repmat('0', [1 t])));
        B(~ind) = [];
        B = double(char(B) - '0');
        
        我们得到:

        B =
             0     1     0     1     0     1
             0     0     1     0     0     1
             0     1     0     0     1     0
        

        解释
        • 第1行:将矩阵
          A
          的每一行转换为由0和1组成的字符串。每行成为单元数组中的一个单元。这将使用未记录的函数来促进此单元格数组转换

        • 第2行:我用来查找
          t
          长的0字符串。我首先使用创建一个搜索字符串,该字符串满0,并且
          t
          长。之后,我确定此单元格数组中的每一行是否包含此字符序列(即
          000….
          )。该函数帮助我们执行正则表达式,并返回单元格数组中每个单元格的任何匹配位置。或者,您可以将该函数用于更新版本的MATLAB,以加快计算速度,但我选择了
          regexp
          ,以便该解决方案与大多数MATLAB发行版兼容

          继续,regexp/strfind的输出是一个由元素组成的单元格数组,其中每个单元格报告我们找到特定字符串的位置。如果我们有一个匹配项,那么输出中应该至少报告一个位置,因此我检查是否有任何匹配项为空,这意味着这些是我们不想要的行