matlab筛选一列数据,要求剔除连续N个以上的某个值,N个以下的保留?要剔除的值已知.

发布时间:2021-02-26 01:54:37

matlab筛选一列数据,要求剔除连续N个以上的某个值,N个以下的保留?要剔除的值已知.

网友回答

设原来数列是IN
需要剔除数值为V,长度超过N个数
b=[0;(IN(:)==V);0];
c=imopen(b,ones(N+1,1));
OUT=IN(~c(2:end-1));
OUT就是输出的序列
======以下答案可供参考======
供参考答案1:
我想不出matlab有什么自带的功能函数来完成这个题目,所以自己写了一段,尽量避免用循环来查找,基本用逻辑运算完成了。这段代码估计我自己明天也看不懂了,希望你能看懂:
delnum = 4;
N = 3;% 连续三个以上就剔除
a = [ 4 4 4 1 3 5 4 4 4 1 5 4 4 4 4 3 4 4 2 4 4 4 ]
% 首先找到所有要删除数字的位置
idx = find( a == delnum );
% 计算位置的差分,目的是找到delnum的连续规律,
% 差分为1的说明某个位置和下一个位置都是delnum,差分不为1说明delnum连续已中断
% 比如数组a里第三个和第九个位置都是一个差分连续中断点
df = [ diff( idx ), inf ];
% 找到差分的中断点,中断点也可以看做是某一小段连续数字的最后一个数的位置
% 为了计算方便,这里假定数组有一个位置0,也是一个中断点
% 所以在break_pos中加入这个假设中断点
break_pos = [ 0 find( df ~= 1 ) ];
% 找到连续N个以上都是4的中断点位置
exp_Pos = find( diff( break_pos ) >= N );% 创建一个逻辑矩阵,用来标记那些位置需要删除
del_Pos = false( size( a ) );
% 满足要求的一个中断点到下一个中断点之间的位置都需要删除
for i = 1 : length( exp_Pos )
del_Pos( idx( break_pos( exp_Pos( i ) ) + 1 ) : idx( break_pos( exp_Pos( i ) + 1 ) ) ) = 1;
enda( del_Pos ) = []
输出结果:a = 4 4 4 1 3 5 4 4 4 1 5 4 4 4 4 3 4 4 2 4 4 4
a = 1 3 5 1 5 3 4 4 2
供参考答案2:
用find(A>B),可以解决你的问题。
以上问题属网友观点,不代表本站立场,仅供参考!