有段时间没有看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)