我有一个包含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]
答案 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