列中的行序列提取(MATLAB)

时间:2014-05-28 14:08:20

标签: matlab row sequence

我试图从MATLAB中的一列数据中提取一系列行。例如,我的数据在一列中看起来像这样:

10 
20 
30 
40 
50 
60 
70 
80 
90 
100 
110 
120 
130

我想选择一系列行并将这些行存储在列向量A中,如果在提取跳过2行的前3行然后选择接下来的3行并跳过2行并选择接下来3到列的结尾。

最后,数据应该与9 rows and 1 column

一样
10 
20
30
60 
70 
80
110 
120
130

谢谢!

3 个答案:

答案 0 :(得分:2)

x = [10 20 30 40 50 60 70 80 90 100 110 120 130].'; %'// data
m = 3; %// keep
n = 2; %// skip

然后

y = x(mod(0:end-1,m+n)<=m-1);

或等效

y = x(mod(0:numel(x)-1,m+n)<=m-1);

这是如何工作的:生成序列0,1,2,... numel(x)-1。每个数字对应x中的位置。要保持m并循环跳过n,请将mod(...,m+n)应用于该序列。例如,对于m=3n=2,结果为序列0,1,2,3,4,0,1,2,...。然后,您可以选择x的那些数字(即<=m-1的相应条目)。这导致周期性模式“保持,保持,保持,跳过,跳过”。


首先跳过然后保持(从上面反转):只需反转不等式:

y = x(mod(0:end-1,m+n)>=m-1);

y = x(mod(0:numel(x)-1,m+n)>=m-1);

答案 1 :(得分:1)

尝试此操作,假设a是您的输入列向量 -

r_accept = 3; %// number of rows to accept
r_reject = 2; %// number of rows to reject

ind1 = bsxfun(@plus,1:r_accept+r_reject:numel(a),[0:r_accept-1]') %//'
out = a(ind1(ind1(:)<=numel(a))) %// desired output

答案 2 :(得分:0)

我只是想出了另一种使用find函数来赞美优秀解决方案的方法。

如果我的数据是:

x = [10; 20; 30; 40; 50; 60; 70; 80; 90; 100; 110; 120; 130]

然后我想提取重复的行序列:
开发keep(3)和skipips(2)行的重复模式或行序列的索引。我的索引是:

index = [1:5 1:5 1:5] 

index = 123451234512345  

然后使用find函数对“保持”序列进行逻辑索引。

a = find(index<4)

给出:

a = 1 2 3 6 7 8 11 12 13  

然后:

b = x(a) 

生成

b = 10 20 30 60 70 80 110 120 130