【IDL】编写高效率的IDL程序
1.利用SuperView数据基于ENVI深度学习进行建筑物提取2.ENVI发布深度学习产品:ENVI Deep Learning Module3.澳大利亚市政局利用ENVI深度学习进行树木调查4.ENVI软件系列产品体系结构5.ENVI新机器学习:ENVITask 使用说明6.ENVI新机器学习:随机森林遥感分类工具操作手册7.ENVI新机器学习:异常探测分类工具操作手册8.新机器学习遥感分类工具9.ENVI深度学习2.0新特性10.IDL封装百度翻译API实现自动翻译和语种识别11.使用IDL进行氚羽流监测(五)—绘制污染物扩散带等值线图12.使用DL进行氚羽流监测(四)——绘制预期氚衰变图13.使用IDL进行氚羽流监测(三)——绘制含水层相对流速14.使用IDL进行氚羽流监测(二)——绘制3D地形和地下水位15.使用IDL进行氚羽流监测(一)——对研究区和环境进行建模16.【IDL】IDL8.8 安装中文语言包方法17.【IDL】IDL 8.7.1机器学习框架18.【IDL】IDL 8.7.1 新特性19.【IDL】获取參边形的最小外接矩形20.【IDL】图形保存图片时文字变黑块的临时解决方法21.【IDL】控制台使用Alt+/代码补全快捷键的方法22.【IDL】IDL 8.6新功能23.【IDL】 程序发布exe清晰步骤24.【IDL) 64位IDL中调用32位功能的方法25.【IDL】 去掉黄色警告图标的方法26.【IDL】 重写HDF文件中数据集的方法27.【IDL】无法使用格式快捷键的解决办法(Ctrl+ Shift+F)28.【IDL】IDL 8.5 中的颜色选择对话框29.【IDL】IDL 8.5 中的 Python Bridge30.【IDL】 开发环境(工作台)的语言切换万法31.【IDL】IDL8.4 文件监视系统体验32.【IDL】 批处理遇到错误时处理方法33.【IDL】开发游戏"2048"34.【IDL】IDL 8.4新特性介绍35.【IDL】IDL中乱码问题的解决方法36.【IDL】 自动构建泰森多边形(Voronoi Polygon)37.【IDL】 IDL 8.3 的新特性与新功能38.【IDL】 IDL 8.3 新功館39.2013开发竞赛ENV/IDL组作品欣赏——“伪装目标识别系统”40.【IDL】多元线性回归计算方法41.【IDL】 关键字继承42.【IDL】调用6S.exe生成查找表源码43.【IDL】使用WIDGET_TIMER进行动画控制44.【IDL】路径相关函数和方法汇总45.【IDL】绘图组件打开鼠标拖拽文件的方法46.【IDL】遠取文本中三維数組的方法47.【IDL】 IDL 8.2.2(SP2)新特性48.【IDL】IDL程序发布方法总结49.【IDL】宏命令菜单(Macros)的用处50.【IDL】 使用SPAWN启动路径中带有空格的文件51.【IDL】 实现双重排序功能(更新降序)52.【IDL】 C#调用ENVL_FX_SEGMENTONLY_DOIT需要注意的地方53.【IDL】 IDL 8.2 新增视频对象IDLffVideoWrite用法示例54.【IDL】生成等差/等比数列的方法55.【IDL】 判断双精度变量是合EQ56.【IDL】 File_Search函数用法详解57.【IDL】坐标轴中文标题乱码问题58.【IDL】C#调用IDL编写界面(含事件)的问题59.《IDL程序设计—数据可视化与ENV二次开发》目录60.《IDL程序设计—数据可视化与ENVI二次开发》已由高等教育出版社正式出版61.IDL Viewer 应用模版介绍(版本号更新为1.2)62.【IDL】日期和时间函数63.【IDL】数组求交集、并集和差集的函数64.【IL】IDL 8.2 新特性65.【IDL】 气象可视化程序配置(idL_guide5)66.【转】几个IDL在线教程网址67.【IDL】医学中IDL的应用68.【IDL】气象中IDL的应用69.【IDL】SIZE函数使用方法与参数含义详解70.【IDL】 DICOM扩展模块71.【IDL】几何图形数学运算函数72.【IDL】 弹出界面事件响应示例程序73.【IDL】鼠标信息显示界面(同理可实现鹰眼图等)74.【IDL】 IDL与C#混合编程技术75.【IDL〕编写程序启动界面76.【IDL】获取n*n数组的对角线元素的方法77.【IDL】同时显示不同分辨率图像的方法78.【IDL】帮助科学家了解太阳系的形成79.【IDL】 Polyval函数(多项式的估值)80.【IDL】 数组下标转换一维坐标索引函数:array_indices_reverse81.【IDL】数据处理时遇到了NAN怎么办82.ENVI二次开发时的波段运算表达式语句合理性检测方法与ENVI检测方法探讨
83.【IDL】编写高效率的IDL程序
84.【IDL】实现ENVI默认显示效果(线性拉伸算法)85.【IDL】双视图关联示例86.【IDL】图像真彩色、假彩色和伪彩色显示87.【IDL】国外学习与开源网站汇总88.【IDL】 如何保存IDL绘制的图像或图形89.【IDL】学习书籍《Modern IDL》90.【IDL】 读写Excel的方法总结91.【IDL】 绘制颜色棒 (colorbar)92.【IDL】 IDL8.1新功能介绍93.【IDL】 讨论浮点运算精度问题 (IDL与Excef和Matlab相比)94.【IDL】 图像显示程序(直接图形法与对象图形法混合显示)95.【IDL】 IDL Advanced及其详细功能介绍96.【IDL】自定义鼠标光标样式(直接图形法与对象图形法)97.【IDL】多条件判断的另类写法(case代替i)98.2014年IDL培训班素材包及录屏共享99.IDL中开发游戏“2048”100.ENVI 6.0自助试用许可开放申请程序的效率问题,在大数据或复杂运算的时候是不能忽略的。但在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', 'data'])
READ_JPEG, file, data
;
if size(data,/n_dimensions) ne 2 then return
dims = size(data,/dimension)
startTime = systime(1)
;当值等于142时,半径5内的元素赋值为0
eqValue = 142
repValue = 0
;符合要求的坐标
suitIdx = calIdxInDistance([0,0],5)
;新数据
nData = data
idxs = where(data eq eqValue,count)
for curIdx =0,count-1 do begin
nSuit = suitIdx
;转换为二维坐标
suitLoc = ARRAY_INDICES(data, idxs[curIdx])
nSuit[0,*]= nSuit[0,*]+suitLoc[0]
nSuit[1,*]= nSuit[1,*]+suitLoc[1]
;下标要在数组自身范围内
nSuit[0,*] = dims[0] < nSuit[0,*] > 0
nSuit[1,*] = dims[1] < nSuit[1,*] > 0
;符合要求的位置赋值
nData[nSuit[0,*],nSuit[1,*]] = repValue
endfor
;输出花费时间
print,systime(1) - startTime
;常规的循环写法
ns = dims[0]
nl = dims[1]
new = data
new1 = data
startTime = systime(1)
for i=0,ns-1 do begin
for j=0,nl-1 do begin
if new[i,j] eq eqValue then begin
for m=0,ns-1 do begin
for n=0,nl-1 do begin
if (m-i*1L)^2+(n-j*1L)^2 le 25 then new1[m,n]=0
endfor
endfor
endif
endfor
endfor
print,'common time:',systime(1) - startTime
window,1,xSize = dims[0]*2,ySize = dims[1]
tvscl,Data,0
tvscl,ndata,1
window,2,xSize = dims[0]*2,ySize = dims[1]
tvscl,new,0
tvscl,new1,1
end
运行后输出:
% Compiled module: TEST_PROCESS. 0.10999990 common time: 116.80900 |
输出图像如下:
结果一样,但循环所花费的时间多了1千多倍,所以方法或函数选择一定要注意下。
合集:
地理遥感生态网地理数据集5
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)