
R中矩阵及相关运算.doc
9页目录:1_矩阵的申城2_矩阵的四则运算3_矩阵的矩阵运算4_矩阵的分解1_1 将向量定义成数组向量只有定义了维数向量(dim 属性)才能被看做是数组,比如z A=matrix(1:15,nrow=3,ncol=5)> A[,1] [,2] [,3] [,4] [,5][1,] 1 4 7 10 13[2,] 2 5 8 11 14[3,] 3 6 9 12 152_矩阵的四则运算可以对数组直接进行四则运算(加减乘除) ,这时进行的数组对应元素的四则运算一般情况下参加运算的矩阵或者数组的维数是相通的,但也可以计算不同维的,这时要将对应的元素补足3_1 转置运算对于矩阵 A,函数 t(A)表示矩阵 A 的转置,如:> A A[,1] [,2] [,3] [,4] [,5][1,] 1 4 7 10 13[2,] 2 5 8 11 14[3,] 3 6 9 12 15> t(A)[,1] [,2] [,3][1,] 1 2 3[2,] 4 5 6[3,] 7 8 9[4,] 10 11 12[5,] 13 14 153_2 求方阵的行列式函数 det()是求矩阵行列式的值,如det(matrix(1:4,nrowx=1:5; Y=2*1:5>x%*%y[,1][1,]110函数 crossprod()是内积运算函数(表示交叉乘积) ,crossprod(x,y) 计算向量 x 与 y 的内积,即 t(x) %*% y'。
crossprod(x)表示 x 与 x 的内积.类似地,tcrossprod(x,y)表示’x%*%t(Y) ’,即 x 与 y 的外积,也称为叉积tcrossprod(x)表示 x 与 x 作外积.如:> x=1:5; y=2*1:5;> crossprod(x);[,1][1,] 55> crossprod(x,y);[,1][1,] 110> tcrossprod(x);[,1] [,2] [,3] [,4] [,5][1,] 1 2 3 4 5[2,] 2 4 6 8 10[3,] 3 6 9 12 15[4,] 4 8 12 16 20[5,] 5 10 15 20 25> tcrossprod(x,y);[,1] [,2] [,3] [,4] [,5][1,] 2 4 6 8 10[2,] 4 8 12 16 20[3,] 6 12 18 24 30[4,] 8 16 24 32 40[5,] 10 20 30 40 504.向量的外积(叉积)设 x 和 y 是 n 维向量,则 x%o%y 表示 x 与 y 作外积.例如> x%o%y;[,1] [,2] [,3] [,4] [,5][1,] 2 4 6 8 10[2,] 4 8 12 16 20[3,] 6 12 18 24 30[4,] 8 16 24 32 40[5,] 10 20 30 40 50outer()是更为强大的外积运算函数,outer(x,y)计算向量二与 y 的外积,它等价于 x %o%y函数。
outer()的一般调用格式为outer(x,y,fun=”*”)其中 x, y 矩阵(或向量),fun 是作外积运算函数,缺省值为乘法运算函数 outer()在绘制三维曲面时非常有用,它可生成一个 x 和 y 的网格5.矩阵的乘法设 A 和 B 为两个矩阵,通常意义下的矩阵乘法是通过 A%*%B 来完成,crossprod(A,B)表示的是t(A)%*%B,而 tcrossprod(A,B)表示的是 A%*%t(B)最后我们通过运算知道 x%*%A%*%x为二次型例子:> A=array(1:9,dim=(c(3,3)))> B=array(9:1,dim=(c(3,3)))> A%*%B;[,1] [,2] [,3][1,] 90 54 18[2,] 114 69 24[3,] 138 84 30> crossprod(A,B)==t(A)%*%B;[,1] [,2] [,3][1,] TRUE TRUE TRUE[2,] TRUE TRUE TRUE[3,] TRUE TRUE TRUE> tcrossprod(A,B)==A%*%t(B);[,1] [,2] [,3][1,] TRUE TRUE TRUE[2,] TRUE TRUE TRUE[3,] TRUE TRUE TRUE6.生成对角阵和矩阵取对角运算函数 diag()依赖于它的变量,当 v 是一个向量时,diag(v)表示以 v 的元素为对角线元素的对角阵.当 M 是一个矩阵时,则 diag(M)表示的是取 M 对角线上的元素的向量.如> v=c(1,4,5);> diag(v);[,1] [,2] [,3][1,] 1 0 0[2,] 0 4 0[3,] 0 0 5> M=array(1:9,dim=c(3,3));> diag(M);[1] 1 5 97.解线性方程组和求矩阵的逆矩阵若求解线性方程组 Ax=b,其命令形式为 solve(A,b),求矩阵 A 的逆,其命令形式为solve(A).设矩阵 A=t(array(c(1:8,10),dim=c(3,3))),b A=t(array(c(1:8,10),dim=c(3,3)));> b=c(1,1,1);> x=solve(A,b);> x;[1] -1.000000e+00 1.000000e+00 3.806634e-16> solve(A);[,1] [,2] [,3][1,] -0.6666667 -1.333333 1[2,] -0.6666667 3.666667 -2[3,] 1.0000000 -2.000000 18.求矩阵的特征值与特征向量函数 eigen(Sm)是求对称矩阵 Sm 的特征值与特征向量,其命令形式为:ev=eigen(Sm),则 ev 存放着对称矩阵 Sm 特征值和特征向量,是由列表形式给出的,其中 ev$values 是 Sm的特征值构成的向量,ev$vectors 是 Sm 的特征向量构成的矩阵.如> Sm=crossprod(A,A);> ev=eigen(Sm);> ev;$values[1] 303.19533618 0.76590739 0.03875643$vectors[,1] [,2] [,3][1,] -0.4646675 0.833286355 0.2995295[2,] -0.5537546 -0.009499485 -0.8326258[3,] -0.6909703 -0.552759994 0.4658502(补充:函数 eigen(Sm) 计算矩阵 A 的特征值和特征向量,函数的结果包括两个成分,特征值和特征向量,表达式 ev A=array(c(1,1,1,4,2,1,1,9,3),dim A[,1] [,2] [,3][1,] 1 4 1[2,] 1 2 9[3,] 1 1 3> det(A)[1] 20> D=eigen(A)> D$values[1] 6.861946+0.000000i -0.430973+1.651934i -0.430973-1.651934i$vectors[,1] [,2] [,3][1,] 0.5688541+0i 0.8556153+0.0000000i 0.8556153+0.0000000i[2,] 0.7483780+0i -0.2834343+0.3928919i -0.2834343-0.3928919i[3,] 0.3410799+0i -0.0906251-0.1581472i -0.0906251+0.1581472i(3) ,特征值分解的性质:我们知道当所求的特征向量构成的矩阵可逆时,会满足,J 的对角线即为上述 Values 的值,我们验证一下:1XA> solve(D$vectors)%*%A%*%D$vectors[,1] [,2] [,3][1,]6.861946e+00+0.000000e+00i 0.000000e+00+4.440892e-16i 0.000000e+00-4.440892e-16i[2,] -7.771561e-16-3.386180e-15i -4.309729e-01+1.651934e+00i 2.775558e-16-3.330669e-16i[3,] -3.330669e-16+2.720046e-15i 2.775558e-16+5.828671e-16i -4.309729e-01-1.651934e+00i计算的精度还是比较高的。
4_2 矩阵的奇异值分解函数 svd(A)是对矩阵 A 奇异值分解,即 A=U%*%D%*%t(V ) ,其中 U,V 是正交矩阵,D 为对角阵,也就是矩阵 A 的奇异值svd(A )的返回值也是列表, svd(A)$d表示矩阵 A 的奇异值,即矩阵 D 的对角线上的元素,svd (A )$u 对应的是正交矩阵U,svd (A)$V 是对应的正交矩阵 V,例如:> A A[,1] [,2] [,3][1,] 1 2 3[2,] 4 5 6[3,] 7 8 10> SVD SVD$d[1] 17.4125052 0.8751614 0.1968665$u[,1] [,2] [,3][1,] -0.2093373 0.96438514 0.1616762[2,] -0.5038485 0.03532145 -0.8630696[3,] -0.8380421 -0.26213299 0.4785099$v[,1] [,2] [,3][1,] -0.4646675 -0.833286355 0.2995295[2,] -0.5537546 0.009499485 -0.8326258[3,] -0.6909703 0.552759994 0.4658502> attach(SVD)> d[1] 17.4125052 0.8751614 0.1968665> u[,1] [,2] [,3][1,] -0.2093373 0.96438514 0.1616762[2,] -0.5038485 0.03532145 -0.8630696[3,] -0.8380421 -0.26213299 0.4785099> v[,1] [,2] [,3][1,] -0.4646675 -0.833286355 0.2995295[2,] -0.5537546 0.009499485 -0.。












