【IDL】IDL 8.4新特性介紹

地理遥感生态网平台發表於2024-06-27

IDL 8.4於2014年10月15日正式釋出。此版本中新增了許多實用的功能和工具,比如資料讀取與視覺化、新增資料型別等。而且IDL正向著更加現代化的語言發展,比如函式程式設計(Functional Programming)、靜態類和方法等。除此之外,IDL工作臺本身也變得更加人性化。主要改進如下:

  • 資料讀取
  • 圖形視覺化
  • 資料分析
  • 資料型別
  • 語言更新

1. 資料讀取

  • HDF5 函式庫

更新提供對壓縮格式SZIP (v2.1) 的只讀支援。

  • 影片讀取增強

在之前版本中,使用 IDL 讀取 FFmpeg 時會彈出錯誤訊息,並且 IDLffVideoRead 物件初始化失敗。在 IDL 8.4 版本中,如果影片或音訊編碼不支援時,IDL 將自動忽略並繼續開啟影片檔案。使用者可以使用新的 VERBOSE 關鍵字來強制 IDL 彈出錯誤訊息提示。

  • 支援輸出Geospatial PDF

新增 IDLffGeospatialPDF 類,提供了輸出圖形為 Geospatial PDF 檔案的功能。

2. 圖形視覺化

  • 新增獲取程式碼方法

在快速視覺化中,新增 GenerateCode 方法,可以獲取當前圖形視覺化顯示風格的原始碼。比如,我們可以手動修改視覺化視窗中的註記、物件屬性、字型、顏色、座標軸等,然後呼叫 GenerateCode 方法獲取當前視窗風格的原始碼,從而進行重複使用。可以選擇是否儲存當前視窗中視覺化的資料。

示例如下,在一個視窗中繪製了一條曲線和一個柱狀圖。然後呼叫GenerateCode方法將原始碼輸出到本地pro檔案中,使用savedata關鍵字可儲存資料到同名sav檔案中。

IDL> p = PLOT(/TEST, THICK=3, COLOR='red', LAYOUT=[2,1,1])
IDL> b = BARPLOT(/TEST, FILL_COLOR='green', LAYOUT=[2,1,2], /CURRENT)
IDL> p.generateCode, 'D:\temp\mycode.pro', /savedata

【IDL】IDL 8.4新特性介紹

自動獲取的程式碼如下:

【IDL】IDL 8.4新特性介紹

  • IDLgrAxis 增強

新增 TICKUNITS = "numeric" 和 TICKUNITS = "scientific" 兩種座標軸顯示風格。

  • ERRORPLOT 新增兩個屬性

ERRORBAR_LINESTYLE —— 控制 Error Bars 的線型

ERRORBAR_THICK —— 控制 Error Bars 的線寬

  • 視覺化視窗工具條

新版 IDL 中,快速視覺化視窗中新增無工具條的選項。

【IDL】IDL 8.4新特性介紹

  • 圖形輸出更加平滑

在呼叫 Save 和 CopyWindow 方法時,IDL 將使用反鋸齒得到一個更加平滑的影像結果。

3. 資料分析

  • 新增 ALOG2 函式

可以計算以2為底的對數。

  • FFT_POWERSPECTRUM 函式

可以計算輸入陣列的傅立葉功率譜,並提供了原始碼。

  • GAUSSINT 函式增強

更新後 GAUSSINT 函式可以接收二維陣列了。

4. 資料型別

  • Big Integers

BIGINTEGER 類可以建立和操作任意大小的整型數字(例如大於64-bits的),並且可以和其他資料型別進行簡單的數學計算。

IDL> b = BigInteger(2)^1279
IDL> help, b
B BIGINTEGER = 1.0407932194664400...x10^385
  • Booleans

BOOLEAN 變數只包含了兩個值:0和1,分別代表 False 和 True。

IDL> a = [0.0, 1.0, 0.0, 3.0]
IDL> b = BOOLEAN(a)
IDL> print, b
 0 1 0 1
IDL> print, json_serialize(b)
 [false,true,false,true]
  • Attributes

可以直接所有 IDL 變數來獲取其屬性,比如DIM、LENGTH、NDIM、TNAME、TYPECODE、TYPENAME等。

IDL> s = findgen(3,4)
IDL> s.DIM
 3 4
IDL> s.NDIM
 2
IDL> s.LENGTH
 12
IDL> s.TYPENAME
 FLOAT
  • 靜態方法(Static Method)

現在可以使用 IDL 變數來呼叫指定的靜態方法,提供了更現代的物件導向程式設計方法。

IDL 變數支援的靜態方法:

【IDL】IDL 8.4新特性介紹

String 字串支援的靜態方法:

【IDL】IDL 8.4新特性介紹

Number 數值支援的靜態方法:

【IDL】IDL 8.4新特性介紹

【IDL】IDL 8.4新特性介紹

Integer 整型支援的靜態方法:

【IDL】IDL 8.4新特性介紹

Pointer 指標支援的靜態方法:

【IDL】IDL 8.4新特性介紹

例如:

IDL> arr = [1.0:5]
IDL> arr
 1.0000000 2.0000000 3.0000000 4.0000000 5.0000000
IDL> arr.Ceil()
 1 2 3 4 5
IDL> arr.Max()
 5.0000000
IDL> arr.Mean()
 3.0000000
IDL> arr.Product()
 120.00000000000000

5. 語言更新

  • 資料夾監視系統

新增的 FOLDERWATCH 類可以監視資料夾的變化,或當資料夾發生變化時呼叫使用者自定義的回撥函式。

這樣使用者就可以編寫一個批處理,使用 FOLDERWATCH 監視一個指定資料夾,當資料夾內發生預想的變化時(如新增檔案、檔案修改或刪除等),繼續執行下面的處理。

如下程式碼,實現了監視'D:\temp\'資料夾的功能,並使用回撥函式MyCallback在IDL工作臺列印檔案修改狀態。

【IDL】IDL 8.4新特性介紹

當我在監視資料夾刪除和重新命名某個檔案時,IDL控制檯提示如下:

【IDL】IDL 8.4新特性介紹

  • 函式程式設計(Functional Programming)

IDL 開始支援函式程式設計,類似其他程式語言。現在可以建立簡單的 inline routines 用於函式程式設計。這些 Lambda 程式可以與這些方法搭配使用,如::Filter、::Map、::Reduce;也可以作為單獨的函式或過程來呼叫。

這裡有幾個示例:

IDL> ;求var的平方根
IDL> var = [0:4]
IDL> PRINT, var.Map(LAMBDA(n: sqrt(n)))
 0.000000 1.00000 1.41421 1.73205 2.00000
 
IDL> ;利用Filter函式求得區間內的素數
IDL> var = [2:50]
IDL> lam = LAMBDA(n:n le 3 || MIN(n mod [2:FIX(SQRT(n))]))
IDL> newvar = var.Filter(lam)
IDL> PRINT, newvar
 2 3 5 7 11 13 17 19 23 29 31 37 41 43 47
  • 程式碼覆蓋範圍

新增 CODE_COVERAGE 函式,可以幫助 IDL 使用者高亮顯示執行和未執行的程式碼行。並整合到了IDL 工作臺中,比如編輯器和剖析工具(Profiler)中。

在IDL編輯器中編寫如下函式,並儲存編譯。

【IDL】IDL 8.4新特性介紹

可以使用code_coverage函式獲取執行和未執行的行號:

【IDL】IDL 8.4新特性介紹

同時可以開啟"視窗 > 剖析工具",單擊如下圖的按鈕,即可在IDL編輯器中使用不同顏色高亮顯示程式碼執行情況,如綠色為執行的程式碼行。

【IDL】IDL 8.4新特性介紹

  • TIMER 類改進

TIMER 類新增兩個方法:Block 和 Unblock。新版 IDL 不會自動中斷回撥。

  • ARRAY_EQUAL 函式改進

新增 NOT_EQUAL 關鍵字,可以逆轉結果。

新增 QUIET 關鍵字,可以抑制所有資料型別轉化時遇到的錯誤。

  • 新增 NOSAVE編譯選項

如果一個程式被標記了 COMPILE_OPT NOSAVE,那麼將不會編譯到IDL .sav檔案中。

  • HASH、ORDEREDHASH、JSON_PARSE 新增 FOLD_CASE 關鍵字。
  • IDL_Container 類新增儲存指標功能。

  • LIST 資料型別更新

List::Sort 方法增加一種可選的比較演算法進行元素的排序;

List::Add 方法進行了最佳化,效能提高。

  • 圖形支援Unicode字元,最多8個十六進位制數字。
  • ISA 函式新增COMPLEX、FLOAT、INTEGER、STRING關鍵字。

  • JSON_SERIALIZE 功能改進

當使用 JSON_SERIALIZE 轉換 IDL 結構體時,可以設定 LOWERCASE 關鍵字,這樣可以使得 JSON 字串結果中的 Tag Names 為小寫。

新版 JSON_SERIALIZE 轉換位元組型數值為整型時,不會將非0值的位元組型全部轉換為ture了,保證資料不會丟失。

  • 庫更新

cURL 庫更新到版本 7.36.0*

OpenSSL 庫更新到版本 1.0.1g*

注:IDL 8.4 將是最後一個包含 Live Tools 函式的版本。在 IDL 8.4 之後的版本中將不再提供。

相關文章