IDL矩阵运算
阵就是数组。
矩阵初始化:用中括号[]而不是圆括号()
矩阵元素取值:可用中括号或者圆括号
例:
IDL> A=[[1,2],[3,4]]
IDL> print,a
1 2
3 4
IDL> print,a[0]
1
IDL> print,a(1)
2
IDL> print,a[1,1]
4
获取矩阵的第一行:
print,A[*,0]
IDL> print,a[*,0]
1 2
获取矩阵的第二行:
print,A[*,1]
获取矩阵的第一列:
print,A[0,*]
IDL> print,a[0,*]
1
3
获取i行j列元素,A[j,i](注意列在前行在后)
IDL> PRINT,A[0,1]
3
A#B相当于 B乘A,而A*B没有什么意义。
如果不可乘,也会有一个结果,自动转换比如A=(1,2),B=(2,3,4)
A#B=
2 4
3 6
4 8
B#A=
2 3 4
4 6 8
矩阵转置:
TRANSPOSE(A)
或者ROTATE(A,1)
如果仅仅是打印,可以使用PM,A
PM, array 就是 PRINT, TRANSPOSE(array) 例子: ; Define an array arr arr = [[1.0, 3.0], [0.0, 4.0], [2.0, 1.0]] ; Print using PM and PRINT PM, arr & PRINT & PRINT, arr IDL prints: 1.00000 0.000000 2.00000 3.00000 4.00000 1.00000 1.00000 3.00000 0.000000 4.00000 2.00000 1.00000
求逆矩阵:
MATRIX_POWER(A,-1)
该函数同样可以求矩阵的其他次方
MATRIX_POWER(A,-2)
矩阵元素乘方:
A^2
IDL> print,a
1 2 3
IDL> print,a^2
1 4 9
要注意:
a^-1语法错误,要写成a^(-1)
a^-1不是a的逆阵,而是内部元素的倒数构成的矩阵,但是有一个问题:都是整数,比如2,倒数不是0.5,而是0
解决办法是,A的其中一个元素必须是浮点数,比如
[1,2],[2,4] 可以写成[1,2.0],[2,4]这样就对了。
如何对不同的列/行增加不同的数值?比如A的第一列加2,第二列加1
IDL> A=[[1,2,3],[4,5,6],[7,8,9]]
IDL> PRINT,A
1 2 3
4 5 6
7 8 9
IDL> B=[TRANSPOSE(replicate(2,3)),TRANSPOSE(replicate(1,3)),TRANSPOSE(replicate(0,3))]
IDL> PRINT,B
2 1 0
2 1 0
2 1 0
IDL> PRINT,A+B
3 3 3
6 6 6
9 9 9
更简便的方法,就是直接对某行某列进行运算
第一列加2:A(0,*)= A(0,*)+2
如何交换一行、列?
交换第一列和第三列过程如下:
IDL> A=[[1,2,3],[4,5,6],[7,8,9]]
IDL> PRINT,A
1 2 3
4 5 6
7 8 9
IDL> TEMP = A[0,*]
IDL> A[0,*]=A[2,*]
IDL> A[2,*]=TEMP
IDL> PRINT,A
3 2 1
6 5 4
9 8 7
行列求和
IDL> A=[[1,2,3],[4,5,6],[7,8,9]]
IDL> print,a
1 2 3
4 5 6
7 8 9
IDL> PRINT,TOTAL(A,1) ;每行求和结果
6.00000 15.0000 24.0000
IDL> PRINT,TOTAL(A,2) ;每列求和结果
12.0000 15.0000 18.0000
原文:http://blog.csdn.net/fbysss/archive/2008/07/26/2712355.aspx