IDL 快捷技巧
原文链接: https://www.nv5geospatialsoftware.com/Learn/Blogs/Blog-Details/quick-idl-tricks
12358 评价这篇文章:
暂无评分
IDL 快捷技巧
匿名 2014年5月15日 星期四
在本期《IDL 数据点》中,我将概述我在 IDL 编程经验中学到的一些快捷技巧。
KEYWORD_SET 检查空字符串
虽然 KEYWORD_SET 函数的主要目的是检查例程的输入参数,但它对于检查一个值是否已定义且非零也非常有用。例如,KEYWORD_SET 可以方便地替换以下两行表达式:
IF N_ELEMENTS(var) GT 0 && var NE 0 THEN ...
用这个单一表达式:
IF KEYWORD_SET(var) THEN ...
此外,如果变量是空字符串,KEYWORD_SET 将返回 0。与上述表达式类似,下面的两行表达式:
IF N_ELEMENTS(str) GT 0 && STRLEN(str) GT 0 THEN ...
可以用这个单一表达式替换:
IF KEYWORD_SET(str) THEN ...
使用 !NULL 丢弃函数结果
有时,你可能想使用某个函数来利用其输入-输出参数,但并不关心其返回值。WHERE 函数就是一个很好的例子:
result = WHERE(arr EQ 1, count)
在这个表达式中,也许你并不关心值 1 在数组中的实际位置,而只想知道数组是否包含值 1;因此,你将使用 count,但永远不会再使用变量result。与其保留这个变量,可以使用 !NULL 简单地将其丢弃,IDL 将不会存储它:
!NULL = WHERE(arr EQ 1, count)
这也可以与 TEMPORARY 函数一起使用来销毁一个已存在的变量:
var = 1
!NULL = TEMPORARY(var)
help, var
VAR UNDEFINED = <未定义>
这不仅对于释放内存很有用(尤其是在变量占用大量内存时),而且有助于调试,通过临时捕获来自多个函数的结果,以便将表达式分解成多行。例如,下面这行代码很难调试,因为 IDL 只会进入一个函数;跳出第一个函数后将返回到下一行,IDL 不会进入第二个函数。
IF func1(var) && func2(var) THEN BEGIN
...
ENDIF
…下面的行也有同样的问题:
IF func1(func2(var)) THEN BEGIN
...
ENDIF
相反,你可以创建几个临时变量:
temp1 = func1(var)
temp2 = func2(var)
IF temp1 && temp2 THEN BEGIN
...
ENDIF
!NULL = TEMPORARY(temp1) & !NULL =TEMPORARY(temp2)
…以及
temp1 = func2(var)
temp2 = func1(temp1)
IF temp2 THEN BEGIN
...
ENDIF
!NULL = TEMPORARY(temp1) & !NULL =TEMPORARY(temp2)
(注意,这类似于 DELVAR,但 DELVAR 仅是一个主程序级别的例程,不能在例程内部使用)。
使用 RETURN 或 CONTINUE 替代 IF 块
有时,通过立即离开当前代码段,而不是使用大型条件语句,可以简化代码。以下是几个例子。
如果条件语句位于例程的末尾,像这样:
PRO myroutine
...
IF(condition) THEN BEGIN
...
ENDIF
END
一旦确定条件不成立,你可以直接从过程中返回:
PRO myroutine
...
IF(~condition) THEN RETURN
...
END
类似地,CONTINUE 可以消除循环中的条件块:
FOR i=0,10 DO BEGIN
IF(condition) THEN BEGIN
....
ENDIF
ENDFOR
可以改为:
FOR i=0,10 DO BEGIN
IF(~condition) THEN CONTINUE
...
ENDFOR
使用 SWITCH 代替多个 OR 检查
有时你可能会有这样的语句:
IF var EQ 1 || var EQ 5 || var EQ 8 || var EQ 11 THEN BEGIN
...
ENDIF ELSE IF var EQ 12 || var EQ 13 THEN BEGIN
...
ENDIF ELSE BEGIN
...
ENDELSE
利用 SWITCH 可以避免多次输入 "var EQ":
SWITCH var OF
1:
5:
8:
11: BEGIN
...
BREAK
END
12:
13: BEGIN
...
BREAK
END
ELSE: BEGIN
...
END
ENDSWITCH
更多 IDL 技巧
更多高效编程的技巧可以在这里找到: 高效 IDL 编程的提示与技巧