跳转至

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 编程的提示与技巧

关注即将到来的 SAR 传感器 ENVI 的 PRISM:美国地质调查局利用高光谱成像绘制阿富汗地图