跳转至

IDL Lambda 函数应用示例

原文链接: https://www.nv5geospatialsoftware.com/Learn/Blogs/Blog-Details/idls-lambda-function-examples

17841 文章评分:

暂未评分

IDL Lambda 函数应用示例

匿名作者 2015年9月10日 星期四

Lambda 函数概念在 IDL 8.4 版本中引入。我发现使用 Lambda 函数可以减少代码行数并节省编码时间。然而,IDL 的 Lambda 函数生成的代码并非最优。根据我的经验,其他语言也存在同样情况。虽然其语法看起来非常简洁,但执行时间和内存使用并非最优。

以下是一些结合 Map、Filter、Reduce 使用 Lambda 函数的示例,并附有 FOR 循环版本以供对比。

首先创建一些数据用于后续示例。

;创建一个包含1400行、由逗号分隔的不同数字组成的字符串数组作为测试数据
str = strjoin(strtrim(fix(bindgen(8,1400)),2),',')

这是一个使用 Map 按逗号分割所有字符串的示例。

;按逗号分割并将结果存入另一数组
a = str.map(lambda(x:x.split(',')))

;使用循环实现完全相同的结果
b = strarr(8,1400)
for j=0,1399 do b[0,j] = str[j].split(',')

下一个示例使用 Filter 仅返回第三列包含 '10' 的字符串:

;筛选仅保留第三列为'10'的行
c = str.filter(lambda(x:(x.split(','))[2] eq '10'))

;使用 For 循环和列表实现
d = list()
for j=0,1399 do if (str[j].split(','))[2] eq '10' then d.Add, str[j]
d = d.ToArray()

最后一个示例使用 Reduce 返回每个字符串独立总和的最大值:

;使用 Reduce 查找最大总和
m = str.reduce(lambda(x,y:isa(x,/string)?total(long(x.split(',')))>total(long(y.split(','))):x>total(long(y.split(',')))))

;使用 for 循环实现
maxtot = -999
for j=0,999 do begin
   tot = total(long(str[j].split(',')))
   if tot gt maxtot then maxtot = tot
 endfor

光与色彩的本质
使用专题变化检测确定小径状况:第一部分