- 1、本文档共5页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 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)