峰值算法
峰值就是一堆数值中的最大值或者最小值吧,你可以使用max和min函数。
l=[1,4,5,6,74,23,2,1,5,7]
print max(l)
print min(l)
‘贰’ 快速查找二维数组的所有峰值,c语言实现最好,python也可以,最好能实现滤波。
#include<stdio.h>
#include<stdlib.h>
#include<limits.h>
#include<malloc.h>
#definemaxsize6//每个波形数据最大采集个数默认6
typedefstructarray1
{
int*data;
structarray1*next;
}ARR1;
ARR1*addNewArr(ARR1*arrHead,ARR1*arrTail);//插入一组波形数据节点返回尾节点
intfindMaxF(ARR1*arrHead);//查找最大峰值
intremoveMinF(ARR1*arrHead);//移除最小峰值数据组返回最小峰值
voidprintfArr(ARR1*arrHead);//打印数据链表
intmain()
{
ARR1*arrHead=(ARR1*)malloc(sizeof(ARR1));
arrHead->next=NULL;
ARR1*arrTail=NULL;
arrTail=addNewArr(arrHead,arrTail);//想插入几组,就调用几次我就测试6组
arrTail=addNewArr(arrHead,arrTail);
arrTail=addNewArr(arrHead,arrTail);
arrTail=addNewArr(arrHead,arrTail);
arrTail=addNewArr(arrHead,arrTail);
arrTail=addNewArr(arrHead,arrTail);
printf("采集的原数据组为:
");
printfArr(arrHead);
printf("最大峰值:%d,最小峰值值:%d
",findMaxF(arrHead),removeMinF(arrHead));
printf("删除最小峰值数据组后的数据为:
");
printfArr(arrHead);
return0;
}
voidprintfArr(ARR1*arrHead)//打印数据链表
{
while(arrHead->next!=NULL)
{
printf("%d,%d,%d,%d,%d,%d
",arrHead->next->data[0],arrHead->next->data[1],arrHead->next->data[2],arrHead->next->data[3],arrHead->next->data[4],arrHead->next->data[5]);
arrHead=arrHead->next;
}
}
ARR1*addNewArr(ARR1*arrHead,ARR1*arrTail)//插入一组波形数据返回尾节点
{
int*data=(int*)malloc(sizeof(int)*maxsize),i;
printf("采集一组波形数据(最大采集个数%d):",maxsize);
for(i=0;i<maxsize;i++)
scanf("%d",&data[i]);
ARR1*arrNew=(ARR1*)malloc(sizeof(ARR1));
arrNew->data=data;
arrNew->next=NULL;
if(arrHead->next==NULL)//插入第一组数组作为首节点
arrHead->next=arrNew;
else
arrTail->next=arrNew;
arrTail=arrNew;
returnarrTail;
}
intfindMaxF(ARR1*arrHead)//查找最大峰值
{
inti,maxNum=0,maxf=0;
while(arrHead->next!=NULL)
{
maxNum=0;
for(i=0;i<maxsize;i++)//获取每组数据的峰值
{
if(arrHead->next->data[i]>maxNum)
maxNum=arrHead->next->data[i];
}
if(maxNum>maxf)//获取最大峰值
maxf=maxNum;
arrHead=arrHead->next;
}
returnmaxf;
}
intremoveMinF(ARR1*arrHead)//移除最小峰值数据组返回最小峰值
{
inti,maxNum=0,minf=INT_MAX;
ARR1*minDataSave=NULL,*arrHeadSave=arrHead;
while(arrHead->next!=NULL)
{
maxNum=0;
for(i=0;i<maxsize;i++)//获取每组数据的峰值
{
if(arrHead->next->data[i]>maxNum)
maxNum=arrHead->next->data[i];
}
if(maxNum<minf)//获取最小峰值
{
minDataSave=arrHead->next;
minf=maxNum;
}
arrHead=arrHead->next;
}
arrHead=arrHeadSave;
//移除最小峰值数据组
while(arrHead->next!=NULL)
{
if(arrHead->next==minDataSave)//删除节点重组链表
{
arrHead->next=minDataSave->next;
minDataSave->next=NULL;
free(minDataSave->data);//释放节点内存
free(minDataSave);
break;
}
arrHead=arrHead->next;
}
returnminf;
}
‘叁’ matlab 求某函数峰值
首先,diff(y)算出来的z并不是严格意义上的y的微分,而是有一定误差的,所以要它严格等于0除非是巧合才能碰到。
但是即使找绝对值z小于error(error是一个自己设定的比较小的数,作为误差)的话也会有问题,主要是error的值不好确定,和x的取值有关,而且会出现如图1所示的问题,有些点能探测到,有些又探测过多。
clearall;closeall;clc;
x=0:0.01:100;
y=x.*sin(x);
error=1e-2
z=diff(y);
length(z)
plot(x,y);holdon;
c=find(z<=error);
c=find(z(c)>=-error);
plot(x(c),y(c),'r*')
图2
‘肆’ 给定一个二维数组.用Python设计实现算法找到一个峰值
#include<stdio.h>
int main()
{int i,j,t,a[3][3]={{1,2,3},{4,5,6},{7,8,9}};
printf("原来的数组:\n");
for(i=0;i<3;i++)
{
for(j=0;j<3;j++)
printf("%d ",a[i][j]);
printf("\n");
}
for(i=0;i<2;i++)
for(j=i+1;j<3;j++)
{t=a[i][j];a[i][j]=a[j][i];a[j][i]=t;}
printf("转置后的数组:\n");
for(i=0;i<3;i++)
{
‘伍’ 测量三极管正玄波电路示波器怎么算测量频率的峰值丶峰峰值
首先先先自矫,示波器本身输出1KHZ信号,自矫完成会出现一个矩形波,横2.5格,竖4格,2.5+2.5=5,4x5=2V(这是信号输入电压)
然后算输入频率,左边的mvx右边的mv=0.2x0.5=1vs,1处于1vs=1kHZ,1s=1000ms,1ms=1000vs
自矫部分算完了,接下来算输入波形的峰值,封峰值:我们任意输入一个正玄波,得出图中的波形,假设mv档调到0.2,ms档调到0.5,先算周期的ms(毫秒):横着数一个完整的正玄波为8格,8x0.5=4ms(这里算出一个周期4毫秒),然后用1处于4=0.25=250HZ(输入频率为250HZ,一个周期4毫秒)峰峰值算法如下:从正玄波峰顶到峰底数为7格,7x0.2(ms取左边的值,你打到多少就x多少)=1.4(V这是峰峰值),峰值就是峰峰值除于2,ok,教程到此结束!
有问题请用QQ搜索群雨道~
‘陆’ 电流电压有效值,平均值
单相正弦交流电的有效值为220V、峰值为310V(有效值乘以1.414)、算术平均值为0V、整流平均值(绝对值的平均值)为198V(有效值除以1.1107)。
三相电峰值、算术平均值、整流平均值、峰值的算法相同。
三相电的相电压有效值为220V。
三相电的线电压有效值为380V。
电流有效值并不等同于电流的平均值,交变电流的有效值是根据电流的热效应定义的,交变电流的平均值是指在某段时间内平均电流的大小。这是两个不同的物理量。
有效值在相同的电阻上分别通过直流电流和交流电流,经过一个交流周期的时间,如果它们在电阻上所消耗的电能相等的话,则把该直流电流(电压)的大小作为交流电流(电压)的有效值,正弦电流(电压)的有效值等于其最大值(幅值)的1/√2,约0.707倍。
在正弦交流电流电中根据热等效原理,定义电流和电压的有效值为其瞬时值在一个周期内的均方根值。
有效值是根据电流热效应来规定的,让一个交流电流和一个直流电流分别通过阻值相同的电阻,如果在相同时间内产生的热量相等,那么就把这一直流电的数值叫做这一交流电的有效值。
在电工技术中,有时并不需要知道交流电的瞬时值,而规定一个能够表征其大小的特定值——有效值,其依据是交流电流和直流电流通过电阻时,电阻都要消耗电能(热效应)。
‘柒’ 现在无锡电费如何算法,什么时间是峰值什么时候是谷值
峰:0.56元(电费单显示是四位小数,保留两位是这么多)每度电,谷:0.36(也是保留两位数)元每度电。
峰时间:早八点到晚九点;其他为谷
‘捌’ 求C#峰值算法公式,在线等,急
能否说的详细点...
这个峰值指什么?
实时读取波形计算峰值? 还是什么....
‘玖’ 利用C8051F020实现音频的峰值检测 求峰值检测软件算法
分析法
‘拾’ python分治法求二维数组局部峰值方法
python分治法求二维数组局部峰值方法
下面小编就为大家分享一篇python分治法求二维数组局部峰值方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
题目的意思大致是在一个n*m的二维数组中,找到一个局部峰值。峰值要求大于相邻的四个元素(数组边界以外视为负无穷),比如最后我们找到峰值A[j][i],则有A[j][i] > A[j+1][i] && A[j][i] > A[j-1][i] && A[j][i] > A[j][i+1] && A[j][i] > A[j][i-1]。返回该峰值的坐标和值。
当然,最简单直接的方法就是遍历所有数组元素,判断是否为峰值,时间复杂度为O(n^2)
再优化一点求每一行(列)的最大值,再通过二分法找最大值列的峰值(具体方法可见一维数组求峰值),这种算法时间复杂度为O(logn)
这里讨论的是一种复杂度为O(n)的算法,算法思路分为以下几步:
1、找“田”字。包括外围的四条边和中间横竖两条边(图中绿色部分),比较其大小,找到最大值的位置。(图中的7)
2、找到田字中最大值后,判断它是不是局部峰值,如果是返回该坐标,如果不是,记录找到相邻四个点中最大值坐标。通过该坐标所在的象限缩小范围,继续比较下一个田字
3、当范围缩小到3*3时必定会找到局部峰值(也可能之前就找到了)
关于为什么我们选择的范围内一定存在峰值,大家可以这样想,首先我们有一个圈,我们已知有圈内至少有一个元素大于这个圈所有的元素,那么,是不是这个圈中一定有一个最大值?
可能说得有点绕,但是多想想应该能够理解,也可以用数学的反证法来证明。
算法我们理解后接下来就是代码实现了,这里我用的语言是python(初学python,可能有些用法上不够简洁请见谅),先上代码:
import numpy as np
def max_sit(*n): #返回最大元素的位置
temp = 0
sit = 0
for i in range(len(n)):
if(n[i]>temp):
temp = n[i]
sit = i
return sit
def dp(s1,s2,e1,e2):
m1 = int((e1-s1)/2)+s1 #row
m2 = int((e2-s1)/2)+s2 #col
nub = e1-s1
temp = 0
sit_row = 0
sit_col = 0
for i in range(nub):
t = max_sit(list[s1][s2+i], #第一排
list[m1][s2+i], #中间排
list[e1][s2+i], #最后排
list[s1+i][s2], #第一列
list[s1+i][m2], #中间列
list[s1+i][e2], #最后列
temp)
if(t==6):
pass
elif(t==0):
temp = list[s1][s2+i]
sit_row = s1
sit_col = s2+i
elif(t==1):
temp = list[m1][s2+i]
sit_row = m1
sit_col = s2+i
elif(t==2):
temp = list[e1][s2+i]
sit_row = e1
sit_col = s2+i
elif(t==3):
temp = list[s1+i][s2]
sit_row = s1+i
sit_row = s2
elif(t==4):
temp = list[s1+i][m2]
sit_row = s1+i
sit_col = m2
elif(t==5):
temp = list[s1+i][e2]
sit_row = s1+i
sit_col = m2
t = max_sit(list[sit_row][sit_col], #中
list[sit_row-1][sit_col], #上
list[sit_row+1][sit_col], #下
list[sit_row][sit_col-1], #左
list[sit_row][sit_col+1]) #右
if(t==0):
return [sit_row-1,sit_col-1]
elif(t==1):
sit_row-=1
elif(t==2):
sit_row+=1
elif(t==3):
sit_col-=1
elif(t==4):
sit_col+=1
if(sit_row<m1):
e1 = m1
else:
s1 = m1
if(sit_col<m2):
e2 = m2
else:
s2 = m2
return dp(s1,s2,e1,e2)
f = open("demo.txt","r")
list = f.read()
list = list.split("n") #对行进行切片
list = ["0 "*len(list)]+list+["0 "*len(list)] #加上下的围墙
for i in range(len(list)): #对列进行切片
list[i] = list[i].split()
list[i] = ["0"]+list[i]+["0"] #加左右的围墙
list = np.array(list).astype(np.int32)
row_n = len(list)
col_n = len(list[0])
ans_sit = dp(0,0,row_n-1,col_n-1)
print("找到峰值点位于:",ans_sit)
print("该峰值点大小为:",list[ans_sit[0]+1,ans_sit[1]+1])
f.close()
首先我的输入写在txt文本文件里,通过字符串转换变为二维数组,具体转换过程可以看我上一篇博客——python中字符串转换为二维数组。(需要注意的是如果在windows环境中split后的列表没有空尾巴,所以不用加list.pop()这句话)。有的变动是我在二维数组四周加了“0”的围墙。加围墙可以再我们判断峰值的时候不用考虑边界问题。
max_sit(*n)函数用于找到多个值中最大值的位置,返回其位置,python的内构的max函数只能返回最大值,所以还是需要自己写,*n表示不定长参数,因为我需要在比较田和十(判断峰值)都用到这个函数
def max_sit(*n): #返回最大元素的位置
temp = 0
sit = 0
for i in range(len(n)):
if(n[i]>temp):
temp = n[i]
sit = i
return sit
dp(s1,s2,e1,e2)函数中四个参数的分别可看为startx,starty,endx,endy。即我们查找范围左上角和右下角的坐标值。
m1,m2分别是row 和col的中间值,也就是田字的中间。
def dp(s1,s2,e1,e2):
m1 = int((e1-s1)/2)+s1 #row
m2 = int((e2-s1)/2)+s2 #col
依次比较3行3列中的值找到最大值,注意这里要求二维数组为正方形,如果为矩形需要做调整
for i in range(nub):
t = max_sit(list[s1][s2+i], #第一排
list[m1][s2+i], #中间排
list[e1][s2+i], #最后排
list[s1+i][s2], #第一列
list[s1+i][m2], #中间列
list[s1+i][e2], #最后列
temp)
if(t==6):
pass
elif(t==0):
temp = list[s1][s2+i]
sit_row = s1
sit_col = s2+i
elif(t==1):
temp = list[m1][s2+i]
sit_row = m1
sit_col = s2+i
elif(t==2):
temp = list[e1][s2+i]
sit_row = e1
sit_col = s2+i
elif(t==3):
temp = list[s1+i][s2]
sit_row = s1+i
sit_row = s2
elif(t==4):
temp = list[s1+i][m2]
sit_row = s1+i
sit_row = m2
elif(t==5):
temp = list[s1+i][e2]
sit_row = s1+i
sit_row = m2
判断田字中最大值是不是峰值,并找不出相邻最大值
t = max_sit(list[sit_row][sit_col], #中
list[sit_row-1][sit_col], #上
list[sit_row+1][sit_col], #下
list[sit_row][sit_col-1], #左
list[sit_row][sit_col+1]) #右
if(t==0):
return [sit_row-1,sit_col-1]
elif(t==1):
sit_row-=1
elif(t==2):
sit_row+=1
elif(t==3):
sit_col-=1
elif(t==4):
sit_col+=1
缩小范围,递归求解
if(sit_row<m1):
e1 = m1
else:
s1 = m1
if(sit_col<m2):
e2 = m2
else:
s2 = m2
return dp(s1,s2,e1,e2)
好了,到这里代码基本分析完了。如果还有不清楚的地方欢迎下方留言。
除了这种算法外,我也写一种贪心算法来求解这道题,只可惜最坏的情况下算法复杂度还是O(n^2),QAQ。
大体的思路就是从中间位置起找相邻4个点中最大的点,继续把该点来找相邻最大点,最后一定会找到一个峰值点,有兴趣的可以看一下,上代码:
#!/usr/bin/python3
def dp(n):
temp = (str[n],str[n-9],str[n-1],str[n+1],str[n+9]) #中 上 左 右 下
sit = temp.index(max(temp))
if(sit==0):
return str[n]
elif(sit==1):
return dp(n-9)
elif(sit==2):
return dp(n-1)
elif(sit==3):
return dp(n+1)
else:
return dp(n+9)
f = open("/home/nancy/桌面/demo.txt","r")
list = f.read()
list = list.replace(" ","").split() #转换为列表
row = len(list)
col = len(list[0])
str="0"*(col+3)
for x in list: #加围墙 二维变一维
str+=x+"00"
str+="0"*(col+1)
mid = int(len(str)/2)
print(str,mid)
p = dp(mid)
print (p)
f.close()
以上这篇python分治法求二维数组局部峰值方法就是小编分享给大家的全部内容了,希望能给大家一个参考