我试图从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
谢谢!
答案 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=3
,n=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