2017-04-03 136 views
1

我有一个有2列的矩阵。我想删除基于数字的序列排在第2列 例如:Matlab:根据一列数列删除行

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

然后删除行,如果在第2列序列是4 4 2 所以最终会与:

Data = [1 2 
     7 0 
     8 2] 

回答

1

让我们添加一些数据资料,以显示这两个[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]:由@Adiel提供

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 
+0

谢谢!它工作完美。 – Diana

0

回答是马丽娟,但是如果包含在Data号码的范围是超过能够由字符串可以使用被表示的值此方法:

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

创建一个矩阵,示出了具有数据的元素SEQ平等:

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 

然后,我们小号HOULD重塑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]序列包含在Dataidx2每一行的所有元素将是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