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