编写高效率IDL程序.doc

  1. 1、本文档共5页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
编写高效率IDL程序

程序的效率问题,在大数据或复杂运算的时候是不能忽略的。但在IDL程序的编写方式上,不能按照常规的循环for依次处理方式写,简单归纳下,提高效率的运行的写法注意下面两种方式。 1、 尽量避免或少用循环 2、 多用where和Histogram; 说起来很容易,但实际写的时候一定要多斟酌斟酌。 举例1:对2000*2000的数组中大于100的值进行累加。 PRO TEST_TIME   ;   a =  DIST(2000,2000)   sum = 0.   sum1 = 0.   start = SYSTIME(1)   FOR i=0L,N_ELEMENTS(a)-1L DO BEGIN     IF(a[i] GT 100.0) THEN  BEGIN       sum = sum +a[i]          ENDIF   ENDFOR   fortime = SYSTIME(1)-start   PRINT,for time:,fortime     i=0L   start = SYSTIME(1)    WHILE i LT N_ELEMENTS(a)-1L DO BEGIN     IF(a[i] GT 100.0)THEN sum = sum +a[i]        i++   ENDWHILE   whiletime = SYSTIME(1)-start   PRINT,while time:,whiletime     start = SYSTIME(1)   sum = TOTAL(a * (a GT 100.0))   funtime = SYSTIME(1)-start   PRINT,function time:,funtime   ;倍数   print,result for VS function:, fortime/funtime   print,result while VS function:,whiletime/funtime  END 运行后的输出 IDL test_time % Compiled module: TEST_TIME. for time:       1.4510000 while time:       2.0430000 function time:     0.054000139 result for VS function:       26.870301 result while VS function:       37.833235 看到差别了吧,循环比函数直接运算慢至少一个数量级!   举例2:对一个图像中的特定值,若存在,则以该像素为中心,特定半径内的元素统一修改为某值。 以IDL自带的一个图像为例,将数据值等于142的赋为0. 源码如下: ;≌≌≌≌≌≌≌≌≌≌≌≌≌≌≌≌≌≌≌≌≌≌≌≌≌≌≌≌≌≌≌≌≌≌≌≌ ; ;计算两个点的距离 ; function CalDistance, point1, point2   compile_opt idl2    ;   Return, SQRT((point1[0]-point2[0])^2+(point1[1]-point2[1])^2) end ;≌≌≌≌≌≌≌≌≌≌≌≌≌≌≌≌≌≌≌≌≌≌≌≌≌≌≌≌≌≌≌≌≌≌≌≌ ; ;搜索当前坐标周围Distance内的下标,注意输入x和y方向的坐标范围xRange和yRange ; function calIdxInDistance, curLoc, distance;,xRange,yRange   ;初始化临时下标   suitLoc = [0,0]   ;循环一次,计算矩形范围内的符合要求下标   for xLoc = curLoc[0]-distance, curLoc[0]+distance do begin     for yLoc = curLoc[1]-distance, curLoc[1]+distance  do begin       if calDistance(curLoc, [xLoc,yLoc]) LE distance then suitLoc = [[suitLoc],[xLoc,yLoc]]     endfor   end   ;   return, suitLoc[*,1:(N_Elements(suitLoc)/2-1)]   end ;≌≌≌≌≌≌≌≌≌≌≌≌≌≌≌≌≌≌≌≌≌≌≌≌≌≌≌≌≌≌≌≌≌≌≌≌ ; ;测试即调用主函数 pro test_process     ;原数据   file = FILEPATH(rbcells.jpg, $     SUBDIRECTORY = [examples, d

文档评论(0)

woaitiantian + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档