Ⅰ 快速查找二维数组的所有峰值,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;
}
Ⅱ γ能谱分析方法
探测器种类不同,γ能谱分析方法常常不同,下面主要介绍NaI(Tl)γ谱仪能谱法和高纯锗γ谱仪能谱法。
66.6.2.1 NaI(Tl)γ谱仪能谱法
主要仪器BH1936低本底多道γ能谱仪。对137Cs点源γ射线的能量(661.661keV)分辨率应小于9%,系统能量线性≤1%(50keV~2.0MeV),核素比活度分析不确定度≤20%。
(1)试样的采集和制备
高纯锗(HPGe)或碘化钠[NaI(Tl)]γ能谱仪能够对地质、水、土壤、环境和生物试样进行放射性γ核素(Ra、Th、K)分析。试样的采集应根据统计抽样的原则,充分考虑到试样的代表性。试样的采集和制备应根据不同的试样采取不同方法的原则,具体试样的采样量和制备如下:
A.地质试样和环境试样的制备。采样用随机抽样的方法,采样点应注意土壤或环境试样的空间分布。对一个测区而言,采样点越多,试样重量越大,越具有代表性。
每一采样点上采集试样的体积和质量对测量结果的平均值和变异性有直接的影响,试样量越多,平均值的变异越小。决定试样采样量时,应考虑采样对象的粒度、成分、部位、时间、放射性水平和监测仪器的最低探测限。
原则上,最小采样量由监测分析样量MAmin和备用量M0min两部分构成,即:
M=MAmin+M0min
若仪器的最低探测限为LD,则单次分析所需最小试样量为:
岩石矿物分析第三分册有色、稀有、分散、稀土、贵金属矿石及铀钍矿石分析
式中:MAmin为单样最小分析试样量,L或kg;LD为仪器最低探测限,Bq;Y为分析方法的化学回收率;η为仪器的探测效率,s-1·Bq-1;A为一试样中待测核素的浓度或比活度,Bq;λ为待测核素的衰变常数,s-1;t为从采样到测量之间的时间间隔,s。
按公式估计的单样监测分析最小试样量MAmin乘以所需试样容量n,即可求得最小采样总量MAmin。储存备用试样量一般可取MAmin的1~3倍,为事后重复测量、仲裁所需的试样量。
地质试样或环境试样采集后,应剔除杂质、碎石等异物。经烘干至恒量后,用粉碎机粉碎过筛(粒径不大于0.16mm),称量后装入与刻度谱仪的体标准源相同形状和体积的试样盒中,称量(精确至1g)、密封、待测。
B.生物试样的制备。采集的试样必须具有代表性,试样的预处理详见GB/T16145—1995补充件,采集的试样量可根据下面的方程来估算:
岩石矿物分析第三分册有色、稀有、分散、稀土、贵金属矿石及铀钍矿石分析
式中:A为分析试样的放射性比活度,这是可定量分析的最小活度,Bq/kg(L);t为测量试样的时间,s;a为在时间t内,谱仪可测量到的最小计数率,s-1(通常指核素特征峰面积计数率);W为采集试样质量或体积,kg(L);ε为谱仪探测效率(通常指全能峰效率),%;f为被测试样所占采样量份额(包括灰样比,详见GB/T16145—1995附件);P为被分析核素特征峰的γ发射概率;Y为化学分析回收率。
估算时因参数(ta)、W、f、ε、Y等值在很大范围内可有多种组合满足式(66.52),故应根据测量的目的要求、现有条件和花费成本最低等原则,实行优化组合来确定采样量的多少。对一台测量装置固定的γ谱仪,可根据相对测量误差的要求,对(ta)值和特性指数(f、ε、P、Y、t)作出一些估计和假设,然后按A-W关系曲线确定W值。当试样可能出现多种核素时,应以估计的W值中最大者为确定的采样量。
A值可根据占有资料分析估计,或通过粗略预测来估计。当监测的目的是判断和记录核素浓度是否超过限值1/10或1/4以上浓度时,A值可用相应1/10或1/4限值浓度来代替。
根据试样放射性核素含量强弱,试样量(质量或体积)多少,谱仪类型和其系统的主要性能指标,以及现有条件,选择最合适的试样盒制备试样。制备试样应满足下列原则要求。
a.确保使用的试样盒未被放射性污染。
b.对可能引起放射性核素壁吸附的试样(如液体或呈流汁状态试样),必须选择壁吸附小或经一定壁吸附预处理的试样盒装样。
c.装样密度尽可能均匀,并尽量保证与刻度源的质量、密度、体积一样。
d.对含有易挥发核素或伴有放射性气体生成的试样,以及需要使母子核素达到平衡后再测量的试样,在装样后必须密封。
e.对试样量充足,预测核素含量很低,装样密度又小于标准源的试样(通常可能是一些直接分析的试样),可以选用特殊的工具和手段(如压缩机),把试样尽可能压缩到试样盒中。
f.装样体积和试样质量应尽可能精确,前者误差应控制在5%以内,后者应小于1%。
C.水试样的制备。一次分析所需水样的量由下式计算:
岩石矿物分析第三分册有色、稀有、分散、稀土、贵金属矿石及铀钍矿石分析
式中:V为一次分析所需用水量,L;A(LLD)为γ能谱系统的探测下限,Bq;Q为试样中核素的预计浓度,Bq/L;r为预处理过程中核素的回收率。
如果要求做n个平行样,需要的总水样量为nV。
当水样中的放射性核素浓度大于1Bq/L时,可以直接量取体积大于400mL的试样置于测量容器内,密封待测,否则应进行必要的预处理。
水样预处理要在不损失原样中放射性核素的条件下均匀地浓缩以便制成γ能谱测量分析的试样。降水(雨水、雪水),淡水(河水、湖水、饮用水等)和海水试样的预处理方法参见GB/T16140—1995附录A(补充件)。
(2)试样的测量
当低本底γ能谱分析系统(以下简称低本底γ谱仪)经过严格的能量刻度、探测效率和探测下限的确定后,在进行试样测量前用标准试样进行系统的稳定性和状态检查,以便及时发现问题,确保测量分析结果的准确有效。
A.测量的基本程序。
a.测量γ能谱仪的本底。一般情况下,由于本底计数很低。对于低含量试样来说,为了保证本底测量的结果满足一定的统计涨落要求,本底测量一般测量时间较长,需要测量8~10h,然后将本底谱存入计算机系统以备后用。
b.测量标准源。检查系统的状态与稳定性。每次正式测量开始时,都应首先进行标准源测量。
c.测量试样。将待测试样放入谱仪系统待测位置,使被测试样与标准源的测量状态保持一致。即试样盒、装样量、密封条件一样;放置的几何条件一样;测量时间一样。获得试样的γ能谱。
d.分析测量结果。对测得的γ能谱的分析主要是定性分析(即识别峰位,确定所含放射性核素)和定量分析(即确定所含放射性核素的比活度)。
e.测量结果的不确定度分析与对试样的评判。
B.试样核素活度的计算。当测量获取的试样谱存盘后,调用谱仪的谱分析程序进行核素的定性、定量分析。
首先,程序用指定的寻峰方法进行寻峰(也可以先对谱数据进行平滑)。程序常用的平滑方法有多项式最小二乘移动平滑法和多项式加权平滑公式。常用的寻峰方法有一、二、三阶导数法等。寻峰的结果确认谱中存在的全能峰并确定其峰位,计算峰位所对应的能量。然后,程序对每一个寻找到的峰计算其峰净峰面积(用TPA法或函数拟合法),并于核素库中的谱数据进行比较,确认谱中存在的核素。对确认的核素计算其活度值。
a.效率曲线法。活度计算公式:
岩石矿物分析第三分册有色、稀有、分散、稀土、贵金属矿石及铀钍矿石分析
式中:A为试样中核素的活度,Bq/L和Bq/kg;a为特征峰面积计数率,s-1;b为本底峰面积计数率,s-1;C符为符合相加修正因子;P为γ发射概率;ε为γ射线全能峰效率;Fa为相对自吸收修正系数;M为试样质量或体积,kg或L;t为核素衰变时间,即从采样到测量的时间间隔;λ为核素衰变常数,λ=ln2/T1/2,T1/2是半衰期,它和ta的单位一致;
Cd为核素在测量时间的衰变校正因子,按下面公式计算:
Cd=λtc/(1-e-λt)
这里,tc为测量试样的真实时间。如果分析的核素半衰期与测量的时间相比很长,Cd可取为1。
b.相对比较法。程序分析给出峰净面积以后,活度A可按下式计算:
岩石矿物分析第三分册有色、稀有、分散、稀土、贵金属矿石及铀钍矿石分析
其他符号含义与式(66.54)相同。
当使用几个γ射线全能峰测定某核素的活度A时,应首先由每个全能峰按上式分别计算出该核素的活度Ai及其第一类不确定度δA,然后由下式计算:
岩石矿物分析第三分册有色、稀有、分散、稀土、贵金属矿石及铀钍矿石分析
岩石矿物分析第三分册有色、稀有、分散、稀土、贵金属矿石及铀钍矿石分析
可见,使用几个γ射线全能峰,可减小A的统计不确定度。
66.6.2.2 高纯锗γ能谱分析法
详见66.3.2高纯锗γ能谱分析法。
Ⅲ origin8.0里怎么自动寻找峰值并标定
先做出图来,图片左侧竖排的工具栏里有一个图标是由正方形和十字组成的,点击那个图标后,再在图上点击峰值就可以了。
Origin具有两大主要功能:数据分析和绘图。Origin的数据分析主要包括统计、信号处理、图像处理、峰值分析和曲线拟合等各种完善的数学分析功能。准备好数据后,进行数据分析时,只需选择所要分析的数据,然后再选择相应的菜单命令即可。Origin的绘图是基于模板的,Origin本身提供了几十种二维和三维绘图模板而且允许用户自己定制模板。绘图时,只要选择所需要的模板就行。用户可以自定义数学函数、图形样式和绘图模板;可以和各种数据库软件、办公软件、图像处理软件等方便的连接。
Origin可以导入包括ASCII、Excel、pClamp在内的多种数据。另外,它可以把Origin图形输出到多种格式的图像文件,譬如JPEG、GIF、EPS、TIFF等等。
Origin里面也支持编程,以方便拓展Origin的功能和执行批处理任务。Origin里面有两种编程语言——LabTalk和Origin C。
在Origin的原有基础上,用户可以通过编写X-Function来建立自己需要的特殊工具。X-Function可以调用Origin C和NAG函数,而且可以很容易地生成交互界面。用户可以定制自己的菜单和命令按钮,把X-Function放到菜单和工具栏上,以后就可以非常方便地使用自己的定制工具。(注:X-Function是从8.0版本开始支持的。之前版本的Origin主要通过Add-On Moles来扩展Origin的功能。)
Ⅳ xps校正用最强的C峰么
xps校正用最强的C峰。需以C为校准峰进行荷电校正C单质的标准峰位一般284点8减实际测得的C单质峰位等于需平移的,校正的目的是为了避免仪器误差,校正的原则是让C1s的峰位和标准峰位重合。
xps校正用最强的C峰的方法
首先我们要会看XPS高分辨谱原始数据,我们将各元素的高分辨谱的关键数据各元素的结合能和谱峰强度拷贝入origin的数据模块,然后打开该文件,我们可以看到各种特定元素的高分辨谱及对它们进行半定量分析的原始数据。
然后我们需先对原始数据进行荷电校准,然后校准时一般用外来污染碳284点8eV作为基准,所用工具为Origin软件,接下来由于外来污染碳的标准值为284点8eV,故荷电校正值为284点8eV减284点7eV等于0点1eV。
Ⅳ 五个峰:分别是c-h、 c-c、 c-o 、c=o 、o-h什么意思
加成反应是机物分子中的双键或叁键发生断裂,故C错误;
酯化反应的机理是酸脱羟基醇脱氢,碳氧键断裂,故C错误;
乙醇酯化脱去羟基上的氢原子,即氢氧键断裂,故CD错误;
乙醇的催化氧化的机理是醇脱去羟基上的氢以及与羟基所连的碳上的氢,故A正确、B错误;
故选A.
Ⅵ 贪心算法总结
做了这10道题,其实发现贪心算法没有什么规律,要说有什么共同特点就是都是由局部最优从而推出全局最优,每个题基本上都要考虑其局部最优是什么,其全局最优是什么,所以虽然都用到了贪心算法的思想,但是题与题之间又没有什么规律可言。
现在把这10道题的思路总结一下(总结主要以我的主观看法在写,可能别人看会不知道我在说什么)
1.分发饼干:
https://programmercarl.com/0455.%E5%88%86%E5%8F%91%E9%A5%BC%E5%B9%B2.html
思路:想要完成最多的小孩满足,那么就得最小的饼干给胃口最小的小孩
这里的贪心思想,
局部最优就是尽可能让一个饼干喂饱一个
全局最优就是最多的小孩满足
2.摆动序列:
https://programmercarl.com/0376.%E6%91%86%E5%8A%A8%E5%BA%8F%E5%88%97.html
思路:这里要找到最长的摆动序列,那么其实就是找那些波峰波谷,如图所示
可以看出来,在到达波峰波谷的路上有几个数字不会影响什么,可以直接去掉。
那么这里的局部最优就是把单调坡上的点删掉,保留最多的波峰波谷
全局最优就是得到对多的波峰波谷,即最长的摆动序列
3.最大子序和
https://programmercarl.com/0053.%E6%9C%80%E5%A4%A7%E5%AD%90%E5%BA%8F%E5%92%8C.html
这道题显然可以暴力解出来,即列出所有子序和,找出最大的,不过计算量会比贪心大很多。
这里主要介绍贪心解的思想:
想要得到最大子序和,就得保证每次相加时,相加后不能为负数,因为负数继续往下加一定是拉低总和的,那么我们当加成到负数时就重新从下个数开始加,并实时记录最大的子序和,这样一遍循环就能得出最大子序和。
局部最优:加成负数就立刻停止,并从下个元素重新开始
全局最优:得到最大子序和
4.买卖股票的最佳时机II
https://programmercarl.com/0122.%E4%B9%B0%E5%8D%96%E8%82%A1%E7%A5%A8%E7%9A%84%E6%9C%80%E4%BD%B3%E6%97%B6%E6%9C%BAII.html
思路:想要得到最大利润,那就要低价买入高价卖出,那么怎样的买卖才能得到最大利润呢。
这里就体现出贪心算法的“贪”字(我猜的),这道题贪在哪呢,贪在只要有利可图就去做,即只要今天买入的价钱比明天卖出的价钱底,即有利可图,那么我就去做,做就是在今天买入,在明天卖出。
局部最优:得到每天的最大正利润
全局最优:得到最大利润
5.跳跃游戏
https://programmercarl.com/0055.%E8%B7%B3%E8%B7%83%E6%B8%B8%E6%88%8F.html
思路:每个数组的元素代表的是可以跳的最远下标,那么我们只要使那个最远下标包含最后一个下标就是可以跳到,那么我们每跳到一个位置就要更新那个可以跳的范围,即可以跳到的最远下标。
局部最优:每次跳跃都得出最远的跳跃范围
全局最优:最后能跳到的最大范围
6.跳跃游戏II
https://programmercarl.com/0045.%E8%B7%B3%E8%B7%83%E6%B8%B8%E6%88%8FII.html
思路:这道题要得到最小的跳跃数,其实只要保证跳的是位置是可以跳范围内更新最远范围的位置就可以了。
为什么这么说呢?以题例来说:
我们刚开始在‘0’的位置,我们能跳到‘1’和‘2’的位置,那么我们怎么跳呢?可以看到跳到‘1’之后更新的最大范围是‘4’,跳到‘2’之后更新的最大范围是‘3’,所以我们就跳‘2’了,因为跳‘1’之后更新的最大可跳范围更大包含了跳‘2’的最大可跳范围,那么肯定是跳‘3’最优呀,这里就体现了局部最优的思想。
局部最优:每次跳后,更新的最大可调范围最大
全局最优:跳跃次数最少
7.K次取反后最大化的数组和
https://programmercarl.com/1005.K%E6%AC%A1%E5%8F%96%E5%8F%8D%E5%90%8E%E6%9C%80%E5%A4%A7%E5%8C%96%E7%9A%84%E6%95%B0%E7%BB%84%E5%92%8C.html
思路:想要得到最大数组和,我们就可以想到怎样做呢?
一,尽可能保证负数最少
二,负数绝对值大的优先变正
三,正数绝对值小的优先变负,有零变零
本着这三条原则做,就能做出来。
那么这道题体现了什么贪心思想呢?
我感觉,前面那三条都是贪心中‘贪’的体现
在负数中,局部最优就是:绝对值大的负数优先变正
在正数中,局部最优就是:绝对值小的正数变负,有零变零
得到的全局最优:数组和最大
8.加油站
https://programmercarl.com/0134.%E5%8A%A0%E6%B2%B9%E7%AB%99.html
思路:首先可以想到这道题是可以暴力解出来了,即分别以每个加油站为起点,得出可以跑一圈的加油站
那么贪心思想做,该怎么做呢,首先可以想到,如果以一个1点为起点当跑着跑着跑到3,油变为负数时,那么说明以这个起点是不行的,但是以2或3为起点行不行呢?答案肯定是不行的,因为1跑到3,油变为负,说明1~3的gas=0的,所以可以得出,如果1~3油数变为负数,那么由2~3油数肯定也为负数。
所以这里就可以得出,如果经过几个加油站油数变为负了,那么起点就更新为这一段路的下个加油站跑
局部最优:油量一旦为负,就从下个加油站重新跑
全局最优:得出可以跑一圈的加油站起点
9.分发糖果
https://programmercarl.com/0135.%E5%88%86%E5%8F%91%E7%B3%96%E6%9E%9C.html
思路:每个孩子至少一个,如果一个孩子比他旁边的孩子优秀,就要比他旁边的糖果多,这道题一旦两边都考虑很容易顾此失彼,所以我们就定义两个循环,分别从左到右,从右到左去考虑,只要更优秀则比他旁边的多1,如果已经多了就不用变了。
局部最优:保证优秀的孩子比他旁边的孩子糖果多
全局最优:满足题中条件,至少要发的糖果
10.柠檬水找零
https://programmercarl.com/0860.%E6%9F%A0%E6%AA%AC%E6%B0%B4%E6%89%BE%E9%9B%B6.html
思路:我们在找零时要遵守的规则一定是:
5 得5
10 得10减5
15 得15,优先减一个10减一个5 如果10块没有则减三个5
局部最优:以最少用的5块的方式找零
全局最优:得到找零能否进行下去
Ⅶ DOA估计算法
学号:20000300055
姓名:王铎澎
嵌牛导读:文章对DOA算法进行了简单的介绍。
嵌牛正文:https://blog.csdn.net/zhangziju/article/details/100730081?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522160689878119725222413438%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=160689878119725222413438&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~_landing_v2~default-1-100730081.pc_first_rank_v2_rank_v28&utm_term=Musicsuanfa&spm=1018.2118.3001.4449
DOA估计算法
DOA(Direction Of Arrival)波达方向定位技术主要有ARMA谱分析、最大似然法、熵谱分析法和特征分解法,特征分解法主要有MUSIC算法、ESPRIT算法WSF算法等。
MUSIC (Multiple Signal Classification)算法,即多信号分类算法,由Schmidt等人于1979年提出。MUSIC算法是一种基于子空间分解的算法,它利用信号子空间和噪声子空间的正交性,构建空间谱函数,通过谱峰搜索,估计信号的参数。对于声源定位来说,需要估计信号的DOA。MUSIC算法对DOA的估计有很高的分辨率,且对麦克风阵列的形状没有特殊要求,因此应用十分广泛。
运用矩阵的定义,可得到更为简洁的表达式:
X = A S + N X=AS+NX=AS+N
式中
X = [ x 1 ( t ) , x 2 ( t ) , . . . x M ( t ) ] T X=[x_1(t),x_2(t),...x_M(t)]^TX=[x1(t),x2(t),...xM(t)]T,
S = [ S 1 ( t ) , S 2 ( t ) , . . . S D ( t ) ] T S=[S_1(t),S_2(t),...S_D(t)]^TS=[S1(t),S2(t),...SD(t)]T,
A = [ a ( θ 1 ) , a ( θ 2 ) , . . . a ( θ D ) ] T A=[a(\theta_1),a(\theta_2),...a(\theta_D)]^TA=[a(θ1),a(θ2),...a(θD)]T,
N = [ n 1 ( t ) , n 2 ( t ) , . . . n M ( t ) ] T N=[n_1(t),n_2(t),...n_M(t)]^TN=[n1(t),n2(t),...nM(t)]T。
X XX为阵元的输出,A AA为方向响应向量,S SS是入射信号,N NN表示阵列噪声。
其中 φ k = 2 π d λ s i n θ k \varphi_k=\frac{2\pi d}{\lambda}sin\theta_kφk=λ2πdsinθk有
A = [ a ( θ 1 ) , a ( θ 2 ) , . . . a ( θ D ) ] T = [ 1 1 ⋯ 1 e − j φ 1 e − j φ 2 ⋯ e − j φ D ⋮ ⋮ ⋱ ⋮ e − j ( M − 1 ) φ 1 e − j ( M − 1 ) φ 2 ⋯ e − j ( M − 1 ) φ D ] A=[a(\theta_1),a(\theta_2),...a(\theta_D)]^T=\left[
1e−jφ1⋮e−j(M−1)φ11e−jφ2⋮e−j(M−1)φ2⋯⋯⋱⋯1e−jφD⋮e−j(M−1)φD11⋯1e−jφ1e−jφ2⋯e−jφD⋮⋮⋱⋮e−j(M−1)φ1e−j(M−1)φ2⋯e−j(M−1)φD
\right]A=[a(θ1),a(θ2),...a(θD)]T=⎣⎢⎢⎢⎡1e−jφ1⋮e−j(M−1)φ11e−jφ2⋮e−j(M−1)φ2⋯⋯⋱⋯1e−jφD⋮e−j(M−1)φD⎦⎥⎥⎥⎤
对x m ( t ) x_m(t)xm(t)进行N点采样,要处理的问题就变成了通过输出信号x m ( t ) x_m(t)xm(t)的采样{ x m ( i ) = 1 , 2 , . . . , M } \{ x_m (i)=1,2,...,M\}{xm(i)=1,2,...,M}估计信号源的波达方向角θ 1 , θ 2 . . . θ D \theta_1,\theta_2...\theta_Dθ1,θ2...θD,由此可以很自然的将阵列信号看作是噪声干扰的若干空间谐波的叠加,从而将波达方向估计问题与谱估计联系起来。
对阵列输出X做相关处理,得到其协方差矩阵
R x = E [ X X H ] R_x=E[XX^H]Rx=E[XXH]
其中H HH表示矩阵的共轭转置。
根据已假设信号与噪声互不相关、噪声为零均值白噪声,因此可得到:
R x = E [ ( A S + N ) ( A S + N ) H ] = A E [ S S H ] A H + E [ N N H ] = A R S A H + R N R_x=E[(AS+N)(AS+N)^H] =AE[SS^H]A^H+E[NN^H]=AR_SA^H+R_NRx=E[(AS+N)(AS+N)H]=AE[SSH]AH+E[NNH]=ARSAH+RN
其中R s = E [ S S H ] R_s=E[SS^H]Rs=E[SSH]称为信号相关矩阵
R N = σ 2 I R_N=\sigma^2IRN=σ2I是噪声相关阵
σ 2 \sigma^2σ2是噪声功率
I II是M × M M\times MM×M阶的单位矩阵
在实际应用中通常无法直接得到R x R_xRx,能使用的只有样本的协方差矩阵:
R x ^ = 1 N ∑ i = 1 N X ( i ) X H ( i ) \hat{R_x}=\frac{1}{N} \sum_{i=1}^{N}X(i)X^H (i)Rx^=N1∑i=1NX(i)XH(i),R x ^ \hat{R_x}Rx^是R x R_xRx的最大似然估计。
当采样数N → ∞ N\to\inftyN→∞,他们是一致的,但实际情况将由于样本数有限而造成误差。根据矩阵特征分解的理论,可对阵列协方差矩阵进行特征分解,首先考虑理想情况,即无噪声的情况:R x = A R s A H R_x=AR_sA^HRx=ARsAH,对均匀线阵,矩阵A由
A = [ a ( θ 1 ) , a ( θ 2 ) , . . . a ( θ D ) ] T = [ 1 1 ⋯ 1 e − j φ 1 e − j φ 2 ⋯ e − j φ D ⋮ ⋮ ⋱ ⋮ e − j ( M − 1 ) φ 1 e − j ( M − 1 ) φ 2 ⋯ e − j ( M − 1 ) φ D ] A=[a(\theta_1),a(\theta_2),...a(\theta_D)]^T=\left[
1e−jφ1⋮e−j(M−1)φ11e−jφ2⋮e−j(M−1)φ2⋯⋯⋱⋯1e−jφD⋮e−j(M−1)φD11⋯1e−jφ1e−jφ2⋯e−jφD⋮⋮⋱⋮e−j(M−1)φ1e−j(M−1)φ2⋯e−j(M−1)φD
\right]A=[a(θ1),a(θ2),...a(θD)]T=⎣⎢⎢⎢⎡1e−jφ1⋮e−j(M−1)φ11e−jφ2⋮e−j(M−1)φ2⋯⋯⋱⋯1e−jφD⋮e−j(M−1)φD⎦⎥⎥⎥⎤
所定义的范德蒙德矩阵,只要满足θ i ≠ θ j , i ≠ j \theta_i\neq \theta_j,i\neq jθi=θj,i=j,则他的各列相互独立。
若R s R_sRs为非奇异矩阵R a n k ( R s ) = D Rank(R_s)=DRank(Rs)=D,各信号源两两不相干,且M > D M>DM>D,则r a n d ( A R s A H ) = D rand(AR_sA^H)=Drand(ARsAH)=D,
由于R x = E [ X X H ] R_x=E[XX^H]Rx=E[XXH],有:
R s H = R x R_s^H=R_xRsH=Rx
即R s R_sRs为Hermite矩阵,它的特性是都是实数,又由于R s R_sRs为正定的,因此A R s A … … H AR_sA……HARsA……H为半正定的,它有D个正特征值和M − D M-DM−D个零特征值。
再考虑有噪声存在的情况
R x = A R s A H + σ 2 I R_x=AR_sA^H+\sigma^2IRx=ARsAH+σ2I
由于σ 2 > 0 \sigma^2>0σ2>0,R x R_xRx为满秩阵,所以R x R_xRx有M个正实特征值λ 1 , λ 2 . . . λ M \lambda_1,\lambda_2...\lambda_Mλ1,λ2...λM
分别对应于M个特征向量v 1 , v 2 . . . v M v_1,v_2...v_Mv1,v2...vM。又由于R x R_xRx为Hermite矩阵,所以各特征向量是正交的,即:v i H v j = 0 , i ≠ j v_i^Hv_j=0,i\neq jviHvj=0,i=j与信号有关的特征值只有D个,分别等于矩阵A R s A H AR_sA^HARsAH的各特征值与σ 2 \sigma^2σ2之和,其余M − D M-DM−D个特征值为σ 2 \sigma^2σ2,即σ 2 \sigma^2σ2为R RR的最小特征值,它是M − D M-DM−D维的,对应的特征向量v i , i = 1 , 2 , . . . , M v_i,i=1,2,...,Mvi,i=1,2,...,M中,也有D个是与信号有关的,另外M − D M-DM−D个是与噪声有关的,可利用特征分解的性质求出信号源的波达方向θ k \theta_kθk。
MUSIC算法的原理及实现
通过对协方差矩阵的特征值分解,可得到如下结论:
将矩阵R x R_xRx的特征值进行从小到大的排序,即λ 1 ≥ λ 2 ≥ . . . ≥ λ M > 0 \lambda_1 \geq \lambda_2\geq...\geq\lambda_M>0λ1≥λ2≥...≥λM>0,其中D个较大的特征值对应于信号,M − D M-DM−D个较小的特征值对应于噪声。
矩阵R x R_xRx的属于这些特征值的特征向量也分别对应于各个信号和噪声,因此可把R x R_xRx的特征值(特征向量)划分为信号特征(特征向量)与噪声特征(特征向量)。
设λ i \lambda_iλi为R x R_xRx的第i ii个特征值,v i v_ivi是与λ i \lambda_iλi个相对应的特征向量,有:
R x v i = λ i v i R_xv_i=\lambda_iv_iRxvi=λivi
再设λ i = σ 2 \lambda_i=\sigma^2λi=σ2是R x R_xRx的最小特征值R x v i = σ 2 v i i = D + 1 , D + 2... M R_xv_i=\sigma^2v_i i=D+1,D+2...MRxvi=σ2vii=D+1,D+2...M,
将R x = A R s A H + σ 2 I R_x=AR_sA^H+\sigma^2IRx=ARsAH+σ2I代入可得σ 2 v i = ( A R s A H + σ 2 I ) v i \sigma^2v_i=(AR_sA^H+\sigma^2I)v_iσ2vi=(ARsAH+σ2I)vi,
将其右边展开与左边比较得:
A R s A H v i = 0 AR_sA^Hv_i=0ARsAHvi=0
因A H A A^HAAHA是D ∗ D D*DD∗D维的满秩矩阵,( A H A ) − 1 (A^HA)^{-1}(AHA)−1存在;
而R s − 1 R_s^{-1}Rs−1同样存在,则上式两边同乘以R s − 1 ( A H A ) − 1 A H R_s^{-1}(A^HA)^{-1}A^HRs−1(AHA)−1AH,
有:
R s − 1 ( A H A ) − 1 A H A R s A H v i = 0 R_s^{-1}(A^HA)^{-1}A^HAR_sA^Hv_i=0Rs−1(AHA)−1AHARsAHvi=0
于是有
A H v i = 0 , i = D + 1 , D + 2 , . . . , M A^Hv_i=0,i=D+1,D+2,...,MAHvi=0,i=D+1,D+2,...,M
上式表明:噪声特征值所对应的特征向量(称为噪声特征向量)v i v_ivi,与矩阵A AA的列向量正交,而A AA的各列是与信号源的方向相对应的,这就是利用噪声特征向量求解信号源方向的出发点。
用各噪声特征向量为例,构造一个噪声矩阵E n E_nEn:
E n = [ v D + 1 , v D + 2 , . . . v M ] E_n=[v_{D+1},v_{D+2},...v_{M}]En=[vD+1,vD+2,...vM]
定义空间谱P m u ( θ ) P_{mu}(\theta)Pmu(θ):
P m u ( θ ) = 1 a H ( θ ) E n E n H a ( θ ) = 1 ∥ E n H a ( θ ) ∥ 2 P_{mu}(\theta)=\frac{1}{{a^H}(\theta)}E_nE_n^Ha(\theta)=\frac{1}{\Vert E_n^Ha(\theta)\Vert^2}Pmu(θ)=aH(θ)1EnEnHa(θ)=∥EnHa(θ)∥21
该式中分母是信号向量和噪声矩阵的内积,当a ( θ ) a(\theta)a(θ)和E n E_nEn的各列正交时,该分母为零,但由于噪声的存在,它实际上为一最小值,因此P m u ( θ ) P_{mu}(\theta)Pmu(θ)有一尖峰值,由该式,使θ \thetaθ变化,通过寻找波峰来估计到达角。
MUSIC算法实现的步骤
1.根据N个接收信号矢量得到下面协方差矩阵的估计值:
R x = 1 N ∑ i = 1 N X ( i ) X H ( i ) R_x=\frac{1}{N} \sum_{i=1}^NX(i)X^H(i)Rx=N1∑i=1NX(i)XH(i)
对上面得到的协方差矩阵进行特征分解
R x = A R s A H + σ 2 I R_x=AR_sA^H+\sigma^2IRx=ARsAH+σ2I
2.按特征值的大小排序 将与信号个数D DD相等的特征值和对应的特征向量看做信号部分空间,将剩下的M − D M-DM−D个特征值和特征向量看做噪声部分空间,得到噪声矩阵E n E_nEn:
A H v i = 0 , i = D + 1 , D + 2 , . . . , M A^Hv_i=0,i=D+1,D+2,...,MAHvi=0,i=D+1,D+2,...,M
E n = [ v D + 1 , v D + 2 , . . . v M ] E_n=[v_{D+1},v_{D+2},...v_{M}]En=[vD+1,vD+2,...vM]
3.使θ \thetaθ变化 ,按照式
P m u ( θ ) = 1 a H ( θ ) E n E n H a ( θ ) P_{mu}(\theta)=\frac{1}{{a^H}(\theta)E_nE_n^Ha(\theta)}Pmu(θ)=aH(θ)EnEnHa(θ)1
来计算谱函数,通过寻求峰值来得到波达方向的估计值。
clear; close all;
%%%%%%%% MUSIC for Uniform Linear Array%%%%%%%%
derad = pi/180; %角度->弧度
N = 8; % 阵元个数
M = 3; % 信源数目
theta = [-30 0 60]; % 待估计角度
snr = 10; % 信噪比
K = 512; % 快拍数
dd = 0.5; % 阵元间距
d=0:dd:(N-1)*dd;
A=exp(-1i*2*pi*d.'*sin(theta*derad)); %方向矢量
%%%%构建信号模型%%%%%
S=randn(M,K); %信源信号,入射信号
X=A*S; %构造接收信号
X1=awgn(X,snr,'measured'); %将白色高斯噪声添加到信号中
% 计算协方差矩阵
Rxx=X1*X1'/K;
% 特征值分解
[EV,D]=eig(Rxx); %特征值分解
EVA=diag(D)'; %将特征值矩阵对角线提取并转为一行
[EVA,I]=sort(EVA); %将特征值排序 从小到大
EV=fliplr(EV(:,I)); % 对应特征矢量排序
% 遍历每个角度,计算空间谱
for iang = 1:361
angle(iang)=(iang-181)/2;
phim=derad*angle(iang);
a=exp(-1i*2*pi*d*sin(phim)).';
En=EV(:,M+1:N); % 取矩阵的第M+1到N列组成噪声子空间
Pmusic(iang)=1/(a'*En*En'*a);
end
Pmusic=abs(Pmusic);
Pmmax=max(Pmusic)
Pmusic=10*log10(Pmusic/Pmmax); % 归一化处理
h=plot(angle,Pmusic);
set(h,'Linewidth',2);
xlabel('入射角/(degree)');
ylabel('空间谱/(dB)');
set(gca, 'XTick',[-90:30:90]);
grid on;
实现结果
Ⅷ 我要提问急求数学建模优秀论文
建模论文建模论文写作指导
(一)、建模论文的标准组成部分
建模论文作为一种研究性学习有意义的尝试,可以锻炼学生发现问题、解决问题的能力.一般来说,建模论文的标准组成部分由论文的标题、摘要、正文、结论、参考文献等部分组成.现就每个部分做个简要的说明.
1. 题目
题目是给评委的第一印象,所以论文的题目一定要避免指代不清,表达不明的现象.建议将论文所涉及的模型或所用的计算方式写入题目.如“用概率方法计算商场打折与返券的实惠效应”.
2. 摘要
摘要是论文中重要的组成部分.摘要应该使用简练的语言叙述论文的核心观点和主要思想.如果你有一些创新的地方,一定要在摘要中说明.进一步,必须把一些数值的结果放在摘要里面,例如:“我们的最终计算得出,对于消费者来说,打折比返券的实惠率提高了23%.”摘要应该最后书写.在论文的其他部分还没有完成之前,你不应该书写摘要.因为摘要是论文的主旨和核心内容的集中体现,只有将论文全部完成且把论文的体系罗列清楚后,才可写摘要.
摘要一般分三个部分.用三句话表述整篇论文的中心.
第一句,用什么模型,解决什么问题.
第二句,通过怎样的思路来解决问题.
第三句,最后结果怎么样.
当然,对于低年级的同学,也可以不写摘要.
3. 正文
正文是论文的核心,也是最重要的组成部分.在论文的写作中,正文应该是从“提出问题—分析问题—选择模型—建立模型—得出结论”的方式来逐渐进行的.其中,提出问题、分析问题应该是清晰简短.而选择模型和建立模型应该是目标明确、数据详实、公式合理、计算精确.在正文写作中,应尽量不要用单纯的文字表述,尽量多地结合图表和数据,尽量多地使用科学语言,这会使得论文的层次上升.
4. 结论
论文的结论集中表现了这篇论文的成果,可以说,只有论文的结论经得起推敲,论文才可以获得比较高的评价.结论的书写应该注意用词准确,与正文所描述或论证的现象或数据保持绝对的统一.并且一定要对结论进行自我点评,最好是能将结论推广到社会实践中去检验.
5. 参考资料
在论文中,如果使用了其他人的资料.必须在论文后标明引用文章的作者、应用来源等信息.
以下是我找的两篇获奖论文
房贷应该怎么还才合理
摘要及关键词:
本论文主要讨论了怎样还房贷才合理。
关键词: 房贷 本金 利率 等额本金 等额本息
一.问题的提出
随着经济的发展,金融正越来越多的进入普通人的生活;贷款,保险,养老金和信用卡;个人住房抵押贷款是其中重要的一项。
当今社会中,热度最高的话题当属“买房子”。而北京目前房价都在3、4万一平米左右,使人们不得不选择进行贷款。而去银行贷款其实也是一门学问,究竟应该怎样还房贷才合适呢?
下面数据为最近公布的银行贷款利率
短期贷款:
中长期贷款:
六个月以内(含六个月):5.60
一至三年(含三年)6.10
六个月至一年(含一年)6.06
三年至五年(含五年)6.45
五年以上6.60
二.模型的假设
1.银行在贷款期利率不变
2.在这段期间内不考虑经济波动的影响
3.客户在还款期内还款能力不变,而且不提前还款
三.模型建立
符号规定
A : 客户向银行贷款的本金
B : 客户平均每期应还的本金
C : 客户应向银行还款的总额
D : 客户的利息负担总和
α: 客户向银行贷款的月利率
β: 客户向银行贷款的年利率
m : 贷款期
n : 客户总的还款期数
根据我们的日常生活常识,我们可以得到下面的关系:
(1) (2) (3)
两种比较常见的还款方式
(1)等额本息还款
把按揭贷款的本金总额与利息总额相加,然后平均分摊到还款期限的每个月中。作为还款人,每个月还给银行固定金额。
(2)等额本金还款
又称利随本清、等本不等息还款法。贷款人将本金分摊到每个月内,同时付清上一交易日至本次还款日之间的利息。
等额本息还款模型
(1)贷款期在1年以上:
先假设银行贷给客户的本金是在某个月的1号一次到位的. 客户的合同里规定说,在本金到位后的下个月1号开始还钱,且设在还款期内年利率不变.
因为一年的年利率是β,那么,平均到一个月就是(β/12),也就是月利率α,
即有关系式:
设每月均还款总额是x(元)
(i=1…n)是客户在第i期1号还款前还欠银行的金额
(i=1…n) 是客户在第i期1号还钱后欠银行的金额.
根据上面的分析,有
第1期还款前欠银行的金额:
第1期还款后欠银行的金额:
……
第i期还款前欠银行的金额:
第i期还款后欠银行的金额:
……
第n期还款前欠银行的金额:
第n期还款后欠银行的金额:
因为第n期还款后,客户欠银行的金额就还清. 也就是说:
,
即:
解方程得:
这就是月均还款总额的公式.
因此,客户总的还款总额就等于:
利息负担总和等于:
等额本金还款模型
假设贷款期在1年以上.
设客户第i期应付的金额为 (i=1…n) (单位:元)
因此,客户第一期应付的金额为 :
第二期应付的金额为 :
那么,客户第n期应付的金额为 :
累计应付的还款总额为 :
利息负担总和为 :
四.模型求解
某一个人从银行贷款100万元,贷款期限为五年,即分60次还款,贷款利率为6.45,每次还款金额见下表:
等额本息还款 元 等额本金还款
第一次 19542.7 21952.41
第二次 19542.7 21862.83
第三次 19542.7 21773.24
第四次 19542.7 21683.66
第五次 19542.7 21594.07
第十次 19542.7 21146.15
第二十次 19542.7 20250.30
第三十次 19542.7 19354.45
第四十次 19542.7 18458.6
第五十次 19542.7 17562.7
第六十次 19542.7 16666.89
总还款金额 117 116万
贷款二十年
等额本息还款 等额本金还款
第一次 7514.72 9643.75
第二次 7514.72 9620.84
第三次 7514.72 9597.92
第四次 7514.72 9575
第五次 7514.72 9552.09
第十次 7514.72 9543.5
第20次 7514.72 9208.34
第50次 7514.72 8520.84
第80次 7514.72 7833.34
第100次 7514.72 7375
第150次 7514.72 6229.17
第180次 7514.72 5541.67
第200次 7514.72 5083.33
第210次 7514.72 4854.17
第220次 7514.72 4625
第230次 7514.72 4395.83
第240次 7514.72 4166.67
总还款 180万 166万
贷款三十年
等额本息还款 等额本金还款
第一次 6386.59 8262.5
第二次 6386.59 8247.22
第三次 6386.59 8231.95
第四次 6386.59 8216.67
第五次 6386.59 8201.39
第十次 6386.59 8125
第二十次 6386.59 7972.22
第五十次 6386.59 7513.89
第一百次 6386.59 6750
第一百五十次 6386.59 5986.11
第二百次 6386.59 5222.22
第二百五十次 6386.59 4458.33
第三百次 6386.59 3694.44
第三百一十次 6386.59 3541.67
第三百二十次 6386.59 3388.89
第三百三十次 6386.59 3236.11
第三百四十次 6386.59 3083.33
第三百五十次 6386.59 2939.55
第三百六十次 6386.59 2777.78
总还款 229万 199万
五.模型分析
等额本金还款:适合目前收入较高的人群。借款人在开始还贷时,每月负担比等额本息要重。随着时间推移,还款负担便会逐渐减轻。这种还款方式相对同样期限的等额本息法,总的利息支出较低。
等额本息还款法的特点是每个月归还一样的本息和,容易作出预算。还款初期利息占每月供款的大部分,随本金逐渐返还供款中本金比重增加。等额本息还款法更适用于现期收入少,预期收入将稳定或增加的借款人,或预算清晰的人士和收入稳定的人士。
六.模型应用
该模型可在实践中应用,每一个贷款买房者可应用这个模型,并根据自己的条件和承受能力,对各种贷款方案进行优选。
ETC收费与停车收费成本比较
现在面对严重的高速公路堵车问题,我们真的手足无措吗?几年前,速通公司推出了ETC不停车收费系统,这本应该能很大程度上缓解高速公路收费站拥堵的情况,但实际效果却并不理想。我们觉得 主要原因是ETC成本太高,一台机器要450元钱,于是很多人宁可花时间在路上等。
其实,如果我们仔细算一下成本,便会对这个问题有更新的认识。
我们的几个平均参数:车重m=1.4t,轮胎与地面摩擦系数u=0.17,
汽油热值q= J/kg,93汽油价格7.85元/升(10.68元/千克),发动机空转功率p= 17 kw ,热效率为23%。
一般汽车在出高速时,车道一般有几辆车在排队,我们平均为5辆。每辆车交费时间平均为10s。这样每辆车在收费时启动制动5次,等待50秒。每次启动速度由0到10mph,启动距离为5米。
由此我们推算;
1启动时耗油,设为 ,由能量守恒得到等式 ,代入数据后得到 =7.7g。
2 等待10秒时油耗, = = 16.1g
所以每次汽车出高速要消耗 =119g 汽油,约合1.3元。如果按每周走一次高速算,一年52次就是67.6元,6年下来花在高速收费站毫无意义的油钱就是473.2元,而这钱已经够买一台ETM机了。除去油钱,每次交费时断断续续的启动和刹车,也会对发动机和刹车片造成不小的损耗,增加额外的维修费用。还有很重要的一点是浪费的时间,每次平均要50秒,如果遇上高峰期,几公里长的车队几米几米的向前动,耽误的时间就更别提了。所以综合以上因素考虑,如果汽车在六年内经常走高速的话,使用ETC的成本是要低于停车收费的。
从车主的角度考虑,汽车配备了ETC机,可以在不太高的车速下完成交费。既省下了频繁启动和等待浪费的油钱,也减少了对发动机刹车片的磨损,还省下了很多时间。
从路政部门的角度考虑,如果停车收费,需要在收费站投入大量的纸张、油墨和计算机处理系统并安排相应的工作人员,收上的钱还需要汇总转移一次才能存入银行,既耗材又麻烦。如果使用ETC系统,就可以无纸化收费,无需工作人员进行处理,车主交的钱可以直接与账户挂钩,省下了很多步骤。所以从这些方面考虑,ETC系统可以降低路政部门在收费站投入的成本。
从环境的角度考虑,汽车在刹车和等待时会排放大量的尾气,达正常行驶时的几倍,尤其是在高峰期收费站拥堵时,几百两几千两汽车堵在几公里路上,尾气的排量和密度是大的惊人的。使用ETC系统可以很有效地缓解收费站拥堵的情况,从而减轻汽车尾气对收费站周围环境的影响。
综合以上因素,无论从车主成本、路政部门还是环境角度考虑,使用ETC系统都会起到很大的积极作用。我们在ETC系统的购买上还有两个建议,就是路政部门是不是也可以帮车主分担些费用,因为这对双方都有利;或许政府还可以出台相关政策,在汽车出厂时就配备ETC机,把这笔钱算在购车成本里,并给予相应补贴之类的。
总之越多的车辆配备了ETC机,高速收费站就会越畅通
望楼主采纳。。。。。。。。。。。。。。。。。。。。。很辛苦的。。
Ⅸ 如何理解c/c++和php语言的区别
一、编程语言
1.根据熟悉的语言,谈谈两种语言的区别?
主要浅谈下C/C++和PHP语言的区别:
1)PHP弱类型语言,一种脚本语言,对数据的类型不要求过多,较多的应用于Web应用开发,现在好多互联网开发公司的主流web后台开发语言,主要框架为mvc模型,如smarty,yaf,升级的PHP7速度较快,对服务器的压力要小很多,在新浪微博已经有应用,对比很明显。
2)C/C++开发语言,C语言更偏向硬件底层开发,C++语言是目前为止我认为语法内容最多的一种语言。C/C++在执行速度上要快很多,毕竟其他类型的语言大都是C开发的,更多应用于网络编程和嵌入式编程。
2.volatile是干啥用的,(必须将cpu的寄存器缓存机制回答得很透彻),使用实例有哪些?(重点)
1) 访问寄存器比访问内存单元要快,编译器会优化减少内存的读取,可能会读脏数据。声明变量为volatile,编译器不再对访问该变量的代码优化,仍然从内存读取,使访问稳定。
总结:volatile关键词影响编译器编译的结果,用volatile声明的变量表示该变量随时可能发生变化,与该变量有关的运算,不再编译优化,以免出错。
2)使用实例如下( 区分C程序员和嵌入式系统程序员的最基本的问题。 ):
并行设备的硬件寄存器(如:状态寄存器)
一个中断服务子程序中会访问到的非自动变量(Non-automatic variables)
多线程应用中被几个任务共享的变量
3)一个参数既可以是const还可以是volatile吗?解释为什么。
可以。一个例子是只读的状态寄存器。它是volatile因为它可能被意想不到地改变。它是const因为程序不应该试图去修改它。
4)一个指针可以是volatile 吗?解释为什么。
可以。尽管这并不是很常见。一个例子当中断服务子程序修改一个指向一个buffer的指针时。
下面的函数有什么错误:
int square(volatile int *ptr) {
return *ptr * *ptr;
}
下面是答案:
这段代码有点变态。这段代码的目的是用来返指针*ptr指向值的平方,但是,由于*ptr指向一个volatile型参数,编译器将产生类似下面的代码:
int square(volatile int *ptr){
int a,b;
a = *ptr;
b = *ptr;
return a * b;
}
由于*ptr的值可能被意想不到地改变,因此a和b可能是不同的。结果,这段代码可能并不是你所期望的平方值!正确的代码如下:
long square(volatile int *ptr){
int a;
a = *ptr;
return a * a;
}
更多linux内核视频教程文本资料免费获取后台私信【 内核 】。
3.static const等等的用法,(能说出越多越好)(重点)
² 首先说说const的用法(绝对不能说是常数)
1)在定义的时候必须进行初始化
2)指针可以是const 指针,也可以是指向const对象的指针
3)定义为const的形参,即在函数内部是不能被修改的
4)类的成员函数可以被声明为正常成员函数,不能修改类的成员变量
5)类的成员函数可以返回的是常对象,即被const声明的对象
6)类的成员变量是指成员变量不能在声明时初始化,必须在构造函数的列表里进行初始化
(注:千万不要说const是个常数,会被认为是外行人的!!!!哪怕说个只读也行)
下面的声明都是什么意思?
const int a; a是一个正常整型数
int const a; a是一个正常整型数
const int *a; a是一个指向常整型数的指针,整型数是不可修改的,但指针可以
int * const a; a为指向整型数的常指针,指针指向的整型数可以修改,但指针是不可修改的
int const * a const; a是一个指向常整型数的常指针,指针指向的整型数是不可修改的,同时指针也是不可修改的
通过给优化器一些附加的信息,使用关键字const也许能产生更紧凑的代码。合理地使用关键字const可以使编译器很自然地保护那些不希望被改变的参数,防止其被无意的代码修改。简而言之,这样可以减少bug的出现。
Const如何做到只读?
这些在编译期间完成,对于内置类型,如int, 编译器可能使用常数直接替换掉对此变量的引用。而对于结构体不一定。
² 再说说static的用法(三个明显的作用一定要答出来)
1)在函数体内,一个被声明为静态的变量在这一函数被调用过程中维持其值不变。
2)在模块内(但在函数体外),一个被声明为静态的变量可以被模块内所用函数访问,但不能被模块外其它函数访问。它是一个本地的全局变量。
3)在模块内,一个被声明为静态的函数只可被这一模块内的其它函数调用。那就是,这个函数被限制在声明它的模块的本地范围内使用
4)类内的static成员变量属于整个类所拥有,不能在类内进行定义,只能在类的作用域内进行定义
5)类内的static成员函数属于整个类所拥有,不能包含this指针,只能调用static成员函数
static全局变量与普通的全局变量有什么区别?static局部变量和普通局部变量有什么区别?static函数与普通函数有什么区别?
static全局变量与普通的全局变量有什么区别:static全局变量只初始化一次,防止在其他文件单元中被引用;
static局部变量和普通局部变量有什么区别:static局部变量只被初始化一次,下一次依据上一次结果值;
static函数与普通函数有什么区别:static函数在内存中只有一份,普通函数在每个被调用中维持一份拷贝
4.extern c 作用
告诉编译器该段代码以C语言进行编译。
5.指针和引用的区别
1)引用是直接访问,指针是间接访问。
2)引用是变量的别名,本身不单独分配自己的内存空间,而指针有自己的内存空间
3)引用绑定内存空间(必须赋初值),是一个变量别名不能更改绑定,可以改变对象的值。
总的来说:引用既具有指针的效率,又具有变量使用的方便性和直观性
6. 关于静态内存分配和动态内存分配的区别及过程
1) 静态内存分配是在编译时完成的,不占用CPU资源;动态分配内存运行时完成,分配与释放需要占用CPU资源;
2)静态内存分配是在栈上分配的,动态内存是堆上分配的;
3)动态内存分配需要指针或引用数据类型的支持,而静态内存分配不需要;
4)静态内存分配是按计划分配,在编译前确定内存块的大小,动态内存分配运行时按需分配。
5)静态分配内存是把内存的控制权交给了编译器,动态内存把内存的控制权交给了程序员;
6)静态分配内存的运行效率要比动态分配内存的效率要高,因为动态内存分配与释放需要额外的开销;动态内存管理水平严重依赖于程序员的水平,处理不当容易造成内存泄漏。
7. 头文件中的 ifndef/define/endif 干什么用 ?
预处理,防止头文件被重复使用,包括pragma once都是这样的
8. 宏定义求两个元素的最小值
#define MIN(A,B) ((A) next;
}
else
{
return NULL;
}
}
Node* pFind = pHead;
while (pCurrent) {
pFind = pFind->next;
pCurrent = pCurrent->next;
}
return pFind;
}
2. 给定一个单向链表(长度未知),请遍历一次就找到中间的指针,假设该链表存储在只读存储器,不能被修改
设置两个指针,一个每次移动两个位置,一个每次移动一个位置,当第一个指针到达尾节点时,第二个指针就达到了中间节点的位置
处理链表问题时,”快行指针“是一种很常见的技巧,快行指针指的是同时用两个指针来迭代访问链表,只不过其中一个比另一个超前一些。快指针往往先行几步,或与慢指针相差固定的步数。
node *create() {
node *p1, *p2, *head;
int cycle = 1, x;
head = (node*)malloc(sizeof(node));
p1 = head;
while (cycle)
{
cout > x;
if (x != 0)
{
p2 = (node*)malloc(sizeof(node));
p2->data = x;
p1->next = p2;
p1 = p2;
}
else
{
cycle = 0;
}
}
head = head->next;
p1->next = NULL;
return head;
}
void findmid(node* head) {
node *p1, *p2, *mid;
p1 = head;
p2 = head;
while (p1->next->next != NULL)
{
p1 = p1->next->next;
p2 = p2->next;
mid = p2;
}
}
3. 将一个数组生成二叉排序树
排序,选数组中间的一个元素作为根节点,左边的元素构造左子树,右边的节点构造有子树。
4. 查找数组中第k大的数字?
因为快排每次将数组划分为两组加一个枢纽元素,每一趟划分你只需要将k与枢纽元素的下标进行比较,如果比枢纽元素下标大就从右边的子数组中找,如果比枢纽元素下标小从左边的子数组中找,如果一样则就是枢纽元素,找到,如果需要从左边或者右边的子数组中再查找的话,只需要递归一边查找即可,无需像快排一样两边都需要递归,所以复杂度必然降低。
最差情况如下:假设快排每次都平均划分,但是都不在枢纽元素上找到第k大第一趟快排没找到,时间复杂度为O(n),第二趟也没找到,时间复杂度为O(n/2),第k趟找到,时间复杂度为O(n/2k),所以总的时间复杂度为O(n(1+1/2+....+1/2k))=O(n),明显比冒泡快,虽然递归深度是一样的,但是每一趟时间复杂度降低。
5. 红黑树的定义和解释?B树的基本性质?
红黑树:
性质1. 节点是红色或黑色。
性质2. 根节点是黑色。
性质3. 每个叶子结点都带有两个空的黑色结点(被称为黑哨兵),如果一个结点n的只有一个左孩子,那么n的右孩子是一个黑哨兵;如果结点n只有一个右孩子,那么n的左孩子是一个黑哨兵。
性质4 每个红色节点的两个子节点都是黑色。(从每个叶子到根的所有路径上不能有两个连续的红色节点)
性质5. 从任一节点到其每个叶子的所有路径都包含相同数目的黑色节点。
B树:
1.所有非叶子结点至多拥有两个儿子(Left和Right);
2.所有结点存储一个关键字;
3.非叶子结点的左指针指向小于其关键字的子树,右指针指向大于其关键字的子树;
6. 常见的加密算法?
对称式加密就是加密和解密使用同一个密钥。
非对称式加密就是加密和解密所使用的不是同一个密钥,通常有两个密钥,称为“公钥”和“私钥”,它们两个必需配对使用。
DES:对称算法,数据加密标准,速度较快,适用于加密大量数据的场合;
MD5的典型应用是对一段Message产生fingerprint(指纹),以防止被“篡改”。
RSA是第一个既能用于数据加密也能用于数字签名的算法。
7. https?
HTTP下加入SSL层,HTTPS的安全基础是SSL。
8.有一个IP库,给你一个IP,如何能够快速的从中查找到对应的IP段?不用数据库如何实现?要求省空间
9.简述一致性hash算法。
1)首先求memcached服务器(节点)的哈希值,并将其配置到0 232的圆(continuum)。
2)然后采用同样的方法求出存储数据的键的哈希值,并映射到相同的圆上。
3)然后从数据映射到的位置开始顺时针查找,将数据保存到找到的第一个服务器上。如果超过232仍然找不到服务器,就会保存到第一台memcached服务器上。
11.描述一种hash table的实现方法
1) 除法散列法: p ,令 h(k ) = k mod p ,这里, p 如果选取的是比较大的素数,效果比较好。而且此法非常容易实现,因此是最常用的方法。最直观的一种,上图使用的就是这种散列法,公式: index = value % 16,求模数其实是通过一个除法运算得到的。
2) 平方散列法 :求index频繁的操作,而乘法的运算要比除法来得省时。公式: index = (value * value) >> 28 (右移,除以2^28。记法:左移变大,是乘。右移变小,是除)
3) 数字选择法:如果关键字的位数比较多,超过长整型范围而无法直接运算,可以选择其中数字分布比较均匀的若干位,所组成的新的值作为关键字或者直接作为函数值。
4) 斐波那契(Fibonacci)散列法:平方散列法的缺点是显而易见的,通过找到一个理想的乘数index = (value * 2654435769) >> 28
冲突处理:令数组元素个数为 S ,则当 h(k) 已经存储了元素的时候,依次探查 (h(k)+i) mod S , i=1,2,3…… ,直到找到空的存储单元为止(或者从头到尾扫描一圈仍未发现空单元,这就是哈希表已经满了,发生了错误。当然这是可以通过扩大数组范围避免的)。
12、各类树结构的实现和应用
13、hash,任何一个技术面试官必问(例如为什么一般hashtable的桶数会取一个素数?如何有效避免hash结果值的碰撞)
不选素数的话可能会造成hash出值的范围和原定义的不一致
14.什么是平衡二叉树?
左右子树都是平衡二叉树,而且左右子树的深度差值的约对值不大于1。
15.数组和链表的优缺点
数组,在内存上给出了连续的空间。链表,内存地址上可以是不连续的,每个链表的节点包括原来的内存和下一个节点的信息(单向的一个,双向链表的话,会有两个)。
数组优于链表的:
A. 内存空间占用的少。
B. 数组内的数据可随机访问,但链表不具备随机访问性。
C. 查找速度快
链表优于数组的:
A. 插入与删除的操作方便。
B. 内存地址的利用率方面链表好。
C. 方便内存地址扩展。
17.最小堆插入,删除编程实现
18. 4G的long型整数中找到一个最大的,如何做?
每次从磁盘上尽量多读一些数到内存区,然后处理完之后再读入一批。减少IO次数,自然能够提高效率。分批读入选取最大数,再对缓存的最大数进行快排。
19. 有千万个string在内存怎么高速查找,插入和删除?
对千万个string做hash,可以实现高速查找,找到了,插入和删除就很方便了。关键是如何做hash,对string做hash,要减少碰撞频率。
在内存中维护一个大小为10000的最小堆,每次从文件读一个数,与最小堆的堆顶元素比较,若比堆顶元素大,则替换掉堆顶元素,然后调整堆。最后剩下的堆内元素即为最大的1万个数,算法复杂度为O(NlogN)
(1)全局洗牌法
a)首先生成一个数组,大小为54,初始化为1~54
b)按照索引1到54,逐步对每一张索引牌进行洗牌,首先生成一个余数 value = rand %54,那么我们的索引牌就和这个余数牌进行交换处理
c)等多索引到54结束后,一副牌就洗好了
(2)局部洗牌法:索引牌从1开始,到54结束。这一次索引牌只和剩下还没有洗的牌进行交换, value = index + rand() %(54 - index)
算法复杂度是O(n)
22.请分别用递归和非递归方法,先序遍历二叉树
24.其他各种排序方法
25.哈希表冲突解决方法?
常见的hash算法如下:
解决冲突的方法:
也叫散列法,主要思想是当出现冲突的时候,以关键字的结果值作为key值输入,再进行处理,依次直到冲突解决
线性地址再散列法
当冲突发生时,找到一个空的单元或者全表
二次探测再散列
冲突发生时,在表的左右两侧做跳跃式的探测
伪随机探测再散列
同时构造不同的哈希函数
将同样的哈希地址构造成一个同义词的链表
建立一个基本表和溢出区,凡是和基本元素发生冲突都填入溢出区
六、系统架构
1.设计一个服务,提供递增的SessionID服务,要求保证服务的高可靠性,有哪些方案?集中式/非集中式/分布式
2.多台服务器要执行计划任务,但只有拿到锁的任务才能执行,有一个中心服务器来负责分配锁,但要保证服务的高可靠性。
3.如何有效的判断服务器是否存活?服务器是否踢出集群的决策如何产生?
4.两个服务器如何在同一时刻获取同一数据的时候保证只有一个服务器能访问到数据?
可以采用队列进行处理,写一个队列接口保证同一时间只有一个进程能够访问到数据,或者对于存取数据库的来说,数据库也是可以加锁处理的
5. 编写高效服务器程序,需要考虑的因素
性能对服务器程序来说是至关重要的了,毕竟每个客户都期望自己的请求能够快速的得到响应并处理。那么影响服务器性能的首要因素应该是:
(1)系统的硬件资源,比如说CPU个数,速度,内存大小等。不过由于硬件技术的飞速发展,现代服务器都不缺乏硬件资源。因此,需要考虑的主要问题是如何从“软环境”来提升服务器的性能。
服务器的”软环境“
(2)一方面是指系统的软件资源,比如操作系统允许用户打开的最大文件描述符数量
(3)另一方面指的就是服务器程序本身,即如何从编程的角度来确保服务器的性能。
主要就要考虑大量并发的处理这涉及到使用进程池或线程池实现高效的并发模式(半同步/半异步和领导者/追随者模式),以及高效的逻辑处理方式--有限状态机内存的规划使用比如使用内存池,以空间换时间,被事先创建好,避免动态分配,减少了服务器对内核的访问频率,数据的复制,服务器程序还应该避免不必要的数据复制,尤其是当数据复制发生在用户空间和内核空间之间时。如果内核可以直接处理从socket或者文件读入的数据,则应用程序就没必要将这些数据从内核缓冲区拷贝到应用程序缓冲区中。这里所谓的“直接处理”,是指应用程序不关心这些数据的具体内容是什么,不需要对它们作任何分析。比如说ftp服务器,当客户请求一个文件时,服务器只需要检测目标文件是否存在,以及是否有权限读取就可以了,不需要知道这个文件的具体内容,这样的话ftp服务器就不需要把目标文件读入应用程序缓冲区然后调用send函数来发送,而是直接使用“零拷贝”函数sendfile直接将其发送给客户端。另外,用户代码空间的数据赋值也应该尽可能的避免复制。当两个工作进程之间需要传递大量的数据时,我们就应该考虑使用共享内存来在他们直接直接共享这些数据,而不是使用管道或者消息队列来传递。上下文切换和锁:并发程序必须考虑上下文的切换问题,即进程切换或线程切换所导致的系统开销。即时I/O密集型服务器也不应该使用过多的工作线程(或工作进程),否则进程间切换将占用大量的CPU时间,服务器真正处理业务逻辑的CPU时间比重就下降了。因此为每个客户连接都创建一个工作线程是不可取的。应该使用某种高效的并发模式。(半同步半异步或者说领导者追随者模式)另一个问题就是共享资源的加锁保护。锁通常被认为是导致服务器效率低下的一个因素,因为由他引入的代码不仅不处理业务逻辑,而且需要访问内核资源,因此如果服务器有更好的解决方案,应该尽量避免使用锁。或者说服务器一定非要使用锁的话,尽量使用细粒度的锁,比如读写锁,当工作线程都只读一块内存区域时,读写锁不会增加系统开销,而只有当需要写时才真正需要锁住这块内存区域。对于高峰和低峰的伸缩处理,适度的缓存。
6. QQ飞车新用户注册时,如何判断新注册名字是否已存在?(数量级:几亿)
可以试下先将用户名通过编码方式转换,如转换64位整型。然后设置N个区间,每个区间为2^64/N的大小。对于新的用户名,先通过2分寻找该用户名属于哪个区间,然后在在这个区间,做一个hash。对于不同的时间复杂度和内存要求可以设置不同N的大小~
加一些基础的技术面试之外的职业素养的面试问题
1.你在工作中犯了个错误,有同事打你小报告,你如何处理?
a.同事之间应该培养和形成良好的同事关系,就是要互相支持而不是互相拆台,互相学习,互相帮助,共同进步。
b.如果小报告里边的事情都是事实也就是说确实是本人做的不好不对的方面,那么自己应该有则改之,提高自己。如果小报告里边的事
情全部不是事实,就是说确实诬陷,那么应该首先坚持日久见人心的态度,持之以恒的把本职工作做好,然后在必要的时候通过适当的
方式和领导沟通,相信领导会知道的。
2.你和同事合作完成一个任务,结果任务错过了截止日期,你如何处理?
3.职业规划?
4.离职原因?
5. 项目中遇到的难题,你是如何解决的?
A.时间 b要求 c.方法
Ⅹ 华为p30pro照相模糊怎么回事
手机拍照模糊可能存在以下原因:
1.请您保持摄像头和激光传感器不被遮挡:
如果手机后置摄像头拍摄的照片或视频模糊,可能是摄像头镜头或激光传感器被异物遮挡。
覆盖后置摄像头的保护膜(含透明保护膜)可能会影响其性能,在弱光条件下拍摄时导致镜头耀斑、重影或模糊。
如果设备使用激光对焦、TOF传感器对焦、3D深度传感器测量拍摄距离,那么保护膜、三方保护套或其他遮挡物可能会干扰传感器。导致相机将无法正确对焦,图像模糊和不清晰。使用相机前,请撕下摄像头保护膜(含透明保护膜),并用软布清洁镜头和传感器,使用华为官方保护套。
备注:您可以在官网或我的华为APP搜索对应产品型号,查看对应规格参数>后置摄像头参数。
2.请检查相机是否可以正确对焦:
如果相机距离您拍摄对象太远或太近,图片和视频可能会模糊。
请检查相机是否可以正确对焦。例如:拍摄远处照片时,轻触取景框,聚焦在远处的物体上。拍摄特写镜头时,请将手机距离被拍摄物体至少10厘米,轻触取景框对焦,不要使用变焦。如果取景框中的图像在此过程中变得更清晰,则意味着设备的相机可以正确对焦。
如果相机可以正常对焦,但图片和视频仍然模糊不清楚,请在下面找到不同的场景和解决方案。
如果相机无法正常对焦,请您备份好您的重要数据,携带购机凭证前往华为客户服务中心寻求进一步帮助。
3.请确认对焦完成后再拍摄:
建议您在拍照时用手指点击拍摄主体手动对焦,并且在对焦框消失之前不要点击快门按钮,因为这表明相机仍未完成对焦。
如果您在拍摄视频时点击取景框,相机将锁定焦距,以避免移动设备以更改场景或位置时图像不清晰或不稳定。您可能需要再次触摸取景框才能手动重新对焦相机。要让相机自动对焦,请在拍摄视频时避免触摸取景框。
建议使用默认变焦倍数使用高倍变焦拍照时,手机将切换到数字变焦,相机对轻微的移动都会更敏感。因此,图像可能会显得模糊。建议降低变焦倍数或使用默认变焦倍数(取景框右侧变焦
条上实心白点为默认变焦倍数)。
4.请您保持稳定拍摄:
如果您拍摄对象移动得很快,或者拍摄过程中手机不断移动,相机将无法正常对焦,照片或视频可能会模糊。建议您拍摄过程中请稳住手机,必要时使用三脚架。
如果您试图捕捉移动物体,请按住快门按钮拍摄连拍照片,然后选择最佳照片。连拍仅在分辨率设置为20 MP或更低时可用。
5.您可以适当移动拍摄距离:
由于景深较浅,某些手机相机在拍摄特写照片时可能无法正确对焦。
使用大光圈镜头可以让更多光线进入,但它们景深较浅。使用此类相机时,请确保拍摄的物体距离手机至少20厘米(8英寸),并且位于取景框的中心。
如果您的设备支持超级微距模式,在使用时请保持手机与拍摄对象距离在2.5-10厘米。
6.特殊相机模式拍摄技巧:
在夜间模式、流光快门模式下,相机拍摄曝光时间较长,因此相机或拍摄对象的任何移动都可能导致照片或视频不清晰。拍摄过程中请保持手机稳定,必要时使用三脚架。
大光圈或人像模式会自动模糊背景,使被摄体脱颖而出。这种拍摄模式下的背景模糊属于正常现象,请您放心使用即可。
如尝试以上方法后仍未解决问题,请您备份好您的重要数据(QQ、微信等第三方应用需单独备份),携带购机凭证前往华为客户服务中心寻求进一步帮助。