IDL語言簡明教程


有段時間沒有看SICP了……那本書真的給了我很多啟發。
考試過后一定要再讀SICP。
依然按SICP對語言的分析方式來。這次,加上自己的理解。

在數學中,函數是兩個集合之間的二元關系,它與第一個集合的每個元素正好關聯第二個集合的一個元素。典型的例子是從整數到整數,或從實數到實數的函數。

In mathematics, a function[note 1] is a binary relation between two sets that associates to each element of the first set exactly one element of the second set. Typical examples are functions from integers to integers, or from the real numbers to real numbers.

由於計算機直接從數學中得到啟示,因此,3種事物是最重要的:

  • primitive expressions, which represent the simplest entities the
    language is concerned with, 在函數關系中的primitive本質上是數。

  • means of combination, by which compound elements are built
    from simpler ones, and, 如何表示函數。

  • means of abstraction, by which compound elements can be named
    and manipulated as units,函數如何抽象。

IDL 如何表示函數

命名

第一字符英文字母或下划線或\(,必須由英文字母、數字、下划線和美元符號“\)”組成(可知不包括空格符號),長度不超過128。不得是保留字。
!開頭系統變量。

語法

不需聲明類型。並且數據類型可以隨時改動。‘,’分割語句。

優先級

雙目最高(以及^),*/Mod次之,+-<>最后

  • ()[]
  • *(指針)^++--
  • *(標量乘)/MOD#(矩陣列乘)##矩陣行乘
  • +-<>NOT~
  • EQ NE LT GT LE GE
  • AND OR

最小最大值

a<b<c<d 輸出最小 a>b>c>d 輸出最大

字符串

+

關系運算符

關系運算符:gt lt le ge eq ne(mask某些值),返回0/1表示
arr[arr gt 0],大於0

邏輯

&&(邏輯與) ||(邏輯或) ~(邏輯非)

三元條件表達式

expr1?expr2:expr3

位運算

and(按位與),or(位或),xor(位異或),not(位非)

數組運算(核心)

IDL是一種數據語言,而矩陣即高維數據,數組實際代表了一個矩陣,因此,數組是它的核心內容。

*/

IDL 數組的乘除和基本數據結構類似,但是在乘除時,只使用最短的數組。短數組的矩陣線性空間包含在長數組中,因此有這種合理操作。

#

列乘。一般矩陣的計算都是列乘的。但這里的列乘和矩陣計算不同,要注意。

a = [1,1,1]
b = [2,2,2]

# 按矩陣來說,應該變為一個數。在idl中,形成矩陣樣子的二維數組。
# 按矩陣的意義,應是在向量情況,是對角矩陣,size不同時添全為0行
a # b

##

行乘。

取整

數據正則化(防止過擬合)。
round() (四舍五入)

ceil()(進一取整)
floor() (去尾取整)

fix()(變整數)默認向下取整
fix() = floor() + int()

IDL 的數據結構

數字數據類型

11種。
字節(基石)

  • byte、
    整數與u,64位,6個
  • int、uint、
    -(long) long、ulong、
    -(64位long)long64、ulong64、
    單雙浮點與復數
    -(單雙浮點)float、double、
  • (復數)complex、dcomplex

非數字數據結構(復合數據結構)

// 如何抽象(結構,對象)
struct、
object、
// 已抽象(字符串,指針,列表,哈希)
string、
pointer、
list、
hash

數組(向量)

創建

直接創建

a = [0, 0, 0]

函數創建

零數組

零數組:bytarr(),intarr(),uintarr(),lonarr(),ulonarr(),lon64arr(),fltarr(),dblarr(),complexarr(),dcomplexarr(),strarr()

a = intarr(3)

索引數組

bindgen(),indgen(),lindgen(),l64IndGen(),uindgen(),ul64indgen(),findgen(),dindgen(),cindgen(),dcindgen(),sindgen()

a = indgen(3)

make_array()

數組:make_array([d1[,...,d8]] [,dimension=vector] [,value=value] [,/index] [,size=vector])

a = make_array(3,1, /int)

replicate()

重復:replicate(value, d1[,...,d8])

a = replicate(0, 3)

數組操作

元素個數

n_elements(expression)

幾維,維度個數,類型(2為int),元素個數

size(expression [,/n_dimensions|,/dimensions|,/type|,/tname|,/n_elements])

max, min 與 mean

max(array[,max_subscript][,dimension=value])
min(array[,max_subscript][,dimension=value])
mean(array[,dimension=value])

復合運算方法(均為浮點數精度)

方差

variance(array[,dimension=value])

標准差

stddev(array,[,dimension=value])

求和

total(array[,dimension=value][,/cumulative])

a = [1,2,3]

為6.000000

total(a)

為1.00,3.0000,6.0000

total(a, /cumulative)

查找元素(唯一返回下標)

complement返回不滿足條件
where(array_expression [, count] [, complement=variable] [,ncomplement=variable])

IDL> where(a, count)
           0           1           2
IDL> count
           3
IDL> a
       1       2       3
IDL> where(a gt 2, count)
           2
IDL> count
           1
IDL> a
       1       2       3
IDL> where(a gt 2, complement=count)
           2
IDL> count
           0           1
IDL> a
       1       2       3

其他操作

重排列

reform(array,d1[,...,d8])

IDL> a
       1       2       3
IDL> reform(a, 1, 3)
       1
       2
       3
轉置

transpose(array)

IDL> transpose(a)
       1
       2
       3
排序(唯二返回下標)

sort(array)

IDL> a = [1,9,3,5,6,0]
IDL> sort(a)
           5           0           2           3           4           1
IDL> sort(a)
           5           0           2           3           4           1
IDL> a[sort(a)]
       0       1       3       5       6       9
倒置(返回數組)

reverse(array)

a = [1,9,3,5,6,0]
IDL> reverse(a)
       0       6       5       3       9       1
向前平移(正值)

shift(array,s1,...,sn)

IDL> a
       1       9       3       5       6       0
IDL> shift(a,3)
       5       6       0       1       9       3
返回不同元素值下標

uniq(array,[,index])僅在相鄰狀況下起作用
sort除查找外返回下標的函數。這是第三個返回下表的函數,因為都基於查找。

array = [1,2, 1,1,3,4,4,9]
uniq(array, sort(array))
# 排序,uniq,然后返回下表做array下標
arrray[uniq(array, sort(array))]

字符串(顯示)

字符串

格式化:string(days, format='(i3.3)')(整形三位)

delimiter為連接字符
strjoin(string [,delimiter])

strlen(expression)
strlowcase(string)
strupcase(string)

移除空格
strcompress(string[,/remove_all])(默認連續空格壓縮一空格,加remove移除)
strtrim(string[,flag])(0,右端;1,左端;2左右兩端)

比較
strcmp(string1,string2[,n][,fold_case])前n比較|不區分大小寫

查找子串位置
strpos(expression,search_string[,/reverse_search])
取出子串
strmid(string,pos[,length])

strsplit(string[,pattern][,count=variable][,/fold_case][,/extract][,length=variable])
pattern分隔符fold_case關鍵字extract返回數組並非索引

轉換
fix(string) 也用於取整
long(string)
float(string)
byte(string)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM