现在有数组数据如下0,0,0,0,0,0,0,0,0,0,0,0,0,17,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,17,17,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,34,77,77,81,81,72,72,72,72,72,72,72,72,72,72,72,72,77,77,77,77,77,72,72,72,60,55,60,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,30,0,0,0,0,0,26,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0要求,找到其中有连续出现次数<=n次的几个数字,并将其置为0
当n=5时,处理后结果如下
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,34,77,77,81,81,72,72,72,72,72,72,72,72,72,72,72,72,77,77,77,77,77,72,72,72,60,55,60,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0不知道大家看明白没有。
这实际上是对一维数组进行低频滤波的问题,不知道有没有什么好的的算法
这个有点麻烦谢谢大家了
当n=5时,处理后结果如下
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,34,77,77,81,81,72,72,72,72,72,72,72,72,72,72,72,72,77,77,77,77,77,72,72,72,60,55,60,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0不知道大家看明白没有。
这实际上是对一维数组进行低频滤波的问题,不知道有没有什么好的的算法
这个有点麻烦谢谢大家了
var
{这里用的是Integer数组,如果是其他长度的整型,直接更换声明,算法中不必改动}
A : array[0..17] of Integer = (1,2,2,2,2,2,7,7,4,4,4,4,4,4,4,3,3,3);procedure TForm1.Button1Click(Sender: TObject);
const
C = 4;
var
I, J, K, P, L: Integer;
begin
L := SizeOf(A[Low(A)]);{计算每个元素的长度}
J := 1;
P := Low(A);
K := A[P];
for I := Low(A) to High(A) do begin
if A[I] <> K then begin
if J <= C then FillChar(A[P], (I-P)*L, 0);
J:=1; P:=I; K:=A[I];
end else Inc(J);
end;
if (J <= C) then FillChar(A[P], (High(A)+1-P)*L, 0);
end;
type
{这里用的是Integer数组,如果是其他长度的整型,直接更换声明,算法中不必改动}
TArr = array[0..20] of Integer;var
Arr : TArr = (1,2,2,2,2,2,2,7,4,4,4,4,4,6,6,3,3,3,3,3,3);procedure dododo(var A: TArr; n: Integer);
var
I, J, K, P, L: Integer;
begin
L := SizeOf(A[Low(A)]);{计算每个元素的长度}
J := 1;
P := Low(A);
K := A[P];
for I := Low(A) to High(A) do
if A[I] <> K then begin
if J <= n then FillChar(A[P], (I-P)*L, 0);
J:=1; P:=I; K:=A[I];
end else Inc(J);
if (J <= n) then FillChar(A[P], (High(A)+1-P)*L, 0);
end;{--------以下是测试---------------------------}
procedure TForm1.Button1Click(Sender: TObject);
var
I: Integer;
begin dododo(Arr, 5); Memo1.Clear;
for I := Low(Arr) to High(Arr) do
Memo1.Lines.Add(InttoStr(Arr[I]));
end;
应该是 如果 连续n个数>0,如果出现次数<n的 则将这几个数置为0
当n=4时
这样的不用处理1,2,2,2,2,2,2,7,4,4,4,4,4,6,6,3,3,3,3,3,3数据 1,2,2,2,2,2,0,7,4,0,4,4,4,6,6,3,3,3,3,3,3
处理结果 1,2,2,2,2,2,0,0,0,0,4,4,4,6,6,3,3,3,3,3,3数据 1,0,2,2,2,0,0,0,0,4,4,4,4,6,6,3,0,3,0,3,3
处理结果 0,0,0,0,0,0,0,0,0,4,4,4,4,6,6,3,0,0,0,0,0
不知道能看明白吗。
我实际上是想处理这个波形将那些不连续的毛刺去掉,处理后结果如下
00020 -->00000
00220 -->00000
02220 -->00000
02022 -->00000
22022 -->00000
20222 -->00000
22220 -->22220 不处理
02222 -->02222 不处理
22222 -->22222 不处理
你总该拿出一个不矛盾的描述,我才能给你写算法吧
如果n=5就需要处理了
type
TArr = array[0..20] of Byte;var
Arr : TArr = (1,0,2,2,2,2,2,0,4,0,4,4,4,0,6,3,3,3,3,0,3);procedure dododo(var A: TArr; n: Integer);
var
I, J, P, L: Integer;
begin
L := SizeOf(A[Low(A)]);
J := 1;
P := Low(A);
for I := Low(A) to High(A) do
if A[I] = 0 then begin
if J < n then FillChar(A[P], (I-P)*L, 0);
J:=1; P:=I;
end else Inc(J);
if (J < n) then FillChar(A[P], (High(A)+1-P)*L, 0);
end;{--------以下是测试---------------------------}
procedure TForm1.Button1Click(Sender: TObject);
var
I: Integer;
begin dododo(Arr, 4); Memo1.Clear;
for I := Low(Arr) to High(Arr) do
Memo1.Text := Memo1.Text + InttoStr(Arr[I]) + ',';
{0,0,2,2,2,2,2,0,0,0,4,4,4,0,6,3,3,3,3,0,0,}
end;
或者把27楼代码中的两处J < n改成J <= n