Matlab:根据一列数字

时间:2017-04-03 09:55:05

标签: matlab row sequence

我有一个包含2列的矩阵。我想根据第2列中的一系列数字删除行。 例如:

Data = [1 2
        3 4
        5 4
        6 2
        7 0
        8 2]

然后如果第2列中的序列是4 4 2则删除行。 所以我最终会:

Data = [1 2
        7 0
        8 2]

2 个答案:

答案 0 :(得分:1)

让我们向Data添加一些数据,以便在两个[4 4 2]序列中显示:

Data =

     1     2
     3     4
     5     4
     6     2
     7     0
     8     2
     9     2
     7     4
     1     4
     0     2
     4     0
     3     2

现在,这应该完成工作并删除第二列中包含序列[4 4 2]的行:

Seq=[4 4 2];       % sequence to delete rows according to
Data(bsxfun(@plus,findstr(Data(:,2)',Seq)',(0:length(Seq)-1)),:)=[]

Data =

     1     2
     7     0
     8     2
     9     2
     4     0
     3     2

答案 1 :(得分:0)

@Adiel提供的答案很重要,但如果Data中包含的数字范围超出了字符串可以表示的值,则可以使用此方法:

Data = [1 2
        3 4
        5 4
        6 2
        7 0
        8 2]
Seq = [4 4 2]

创建一个矩阵,显示Seq与Data的元素相等:

r = size(Data, 1);
n = numel(Seq);
idx = bsxfun(@eq, Data(:,2), Seq);
idx =

   0   0   1
   1   1   0
   1   1   0
   0   0   1
   0   0   0
   0   0   1

然后,我们应该将idx重新调整为[r+1,n]

idx2 = false(r+1, n);
idx2(idx) = true;
idx2 =

   0   1   0
   1   1   1
   1   0   0
   0   0   1
   0   0   0
   0   1   0
   0   0   0

现在如果[4 4 2]中包含Data的序列,idx2每行的所有元素都将为1.所以我们应该找到这样的行。

    f = find(all(idx2, 2));
    f = 

       2

找到每个序列开头的索引。要查找其他元素,我们会将0:n-1添加到f

idx3 = bsxfun(@plus, f, 0:n-1);
idx3 =

   2   3   4

删除元素:

Data(idx3, :) = [];
Data =

   1   2
   7   0
   8   2