来自 http://blog.sina.com.cn/s/blog_7271fad1010182j4.html
目录:
1_矩阵的生成
2_矩阵的四则运算
3_矩阵的矩阵运算
4_矩阵的分解
1_1将向量定义成数组
> z=1:12;
> dim(z)=c(3,4);
> z;
[1,]
[2,]
[3,]
1_2用array ( )函数构造多维数组
> x=array(1:20,dim=c(4,5))
> x
[1,]
[2,]
[3,]
[4,]
1_3用matrix()函数构造矩阵
> A=matrix(1:15,nrow=3,byrow=TRUE)
> A
[1,]
[2,]
[3,]
2_矩阵的四则运算
3_1
> A=matrix(1:6,nrow=2);
> A;
[1,]
[2,]
> t(A);
[1,]
[2,]
[3,]
3_2 求方阵的行列式
> det(matrix(1:4,ncol=2));
[1] -2
3_3 向量的内积
维数的向量,则x%*%Y表示x与y作内积.例如,
>x=1:5; Y=2*1:5
>x%*%y
[1,]110
> x=1:5; y=2*1:5;
> crossprod(x);
[1,]
> crossprod(x,y);
[1,]
> tcrossprod(x);
[1,]
[2,]
[3,]
[4,]
[5,]
> tcrossprod(x,y);
[1,]
[2,]
[3,]
[4,]
[5,]
3_4
设x和y是n维向量,则x%o%y表示x与y作外积.例如
> x%o%y;
[1,]
[2,]
[3,]
[4,]
[5,]
函数。outer()的一般调用格式为
3_5
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,]
> crossprod(A,B)==t(A)%*%B;
[1,] TRUE TRUE TRUE
[2,] TRUE TRUE TRUE
[3,] TRUE TRUE TRUE
> tcrossprod(A,B)==A%*%t(B);
[1,] TRUE TRUE TRUE
[2,] TRUE TRUE TRUE
[3,] TRUE TRUE TRUE
3_6 生成对角阵和矩阵取对角运算
> v=c(1,4,5);
> diag(v);
[1,]
[2,]
[3,]
> M=array(1:9,dim=c(3,3));
> diag(M);
[1] 1 5 9
3_7 解线性方程组和求矩阵的逆矩阵
> 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
> solve(A);
[1,] -0.6666667 -1.333333
[2,] -0.6666667
[3,]
3_8 求矩阵的特征值与特征向量
> Sm=crossprod(A,A);
> ev=eigen(Sm);
> ev;
$values
[1] 303.19533618
$vectors
[1,] -0.4646675
[2,] -0.5537546 -0.009499485 -0.8326258
[3,] -0.6909703 -0.552759994
4_1 特征值分解
(1).定义:
(2).在r中的实现:在r中利用函数eigen(A)来求矩阵的特征值和特征向量,具体的调用格式为:
以矩阵A为例说明此问题
> A=array(c(1,1,1,4,2,1,9,3,1),dim=c(3,3));
> D=eigen(A);
> D;
$values
[1]
$vectors
[1,] -0.8597736 -9.486833e-01
[2,] -0.4346498
[3,] -0.2680839
(3).特征值分解的性质:我们知道当所求的的特征向量构成的矩阵可逆时会满足solve(vectors)%*%A%*%vectors=diag(values),下面进行验证。
> solve(vectors)%*%A%*%vectors;
[1,]
[2,]
[3,] -3.471971e-16 -1.607126e-16
结果的精度还是比较高的。
4_2 矩阵的奇异值分解
> A<-t(array(c(1:8,10),dim=c(3,3)))
> SVD=svd(A);
> SVD;
$d
[1] 17.4125052
$u
[1,] -0.2093373
[2,] -0.5038485
[3,] -0.8380421 -0.26213299
$v
[1,] -0.4646675 -0.833286355
[2,] -0.5537546
[3,] -0.6909703
> attach(SVD);
The following object(s) are masked from ‘SVD (position 3)’:
> u%*%diag(d)%*%t(v);
[1,]
[2,]
[3,]
> A;
[1,]
[2,]
[3,]
4_3 qr分解
#建立矩阵
> A=(array(c(1:12),dim=c(4,3)));
> A;
[1,]
[2,]
[3,]
[4,]
#进行矩阵分解
> QR=qr(A);QR
$qr
[1,] -5.4772256 -12.7801930 -2.008316e+01
[2,]
[3,]
[4,]
$rank
[1] 2
$qraux
[1] 1.182574 1.156135 1.373098
$pivot
[1] 1 2 3
attr(,”class”)
[1] “qr”
#提取Q,R并验证分解的正确性。
> Q=qr.Q(QR);
> R=qr.R(QR);
> Q%*%R;
[1,]
[2,]
[3,]
[4,]
4_4 Schur分解
引言:
> A=t(array(c(6,12,19,-9,-20,-33,4,9,15),dim=c(3,3)));
> A;
[1,]
[2,]
[3,]
> det(A);
[1] -1
> W=eigen(A);
> W;
$values
[1]
$vectors
[1,] -0.4082483-0i -0.4082483+0i -0.4740998+0i
[2,]
[3,] -0.4082483+0i -0.4082483-0i -0.3386427+0i
> attach(W);
The following object(s) are masked from ‘W (position 3)’:
> det(vectors);
错误于determinant.matrix(x, logarithm = TRUE, …) :
> det(Re(vectors));
[1] -7.599489e-19
> solve(vectors)
[1,] 0.000000+78209959i
[2,] 0.000000-78209959i
[3,] 3.691206+
描述:
例子:
> A=Matrix(c(6,12,19,-9,-20,-33,4,9,15),ncol=3,byrow=TRUE);
> A;
3 x 3 Matrix of class “dgeMatrix”
[1,]
[2,]
[3,]
> library(Matrix);
> Sch=Schur(A, vectors=TRUE);
> Q=Sch@Q;
> Q=as.matrix(Q)
> attach(Sch);
错误于attach(Sch) : ‘attach’只适用于串列,数据框和环境
> Q%*%T%*%t(Q)
3 x 3 Matrix of class “dgeMatrix”
[1,]
[2,]
[3,]
4_5
描述:
t(X)AX>0,就称A正定(Positive Definite)。正定矩阵在相合变换下可化为标准型, 即单位矩阵。
Cholesky分解:
例子:
> #输入矩阵
> m=matrix(c(5,1,1,3),ncol=2 );
> m;
[1,]
[2,]
> #矩阵分解
> CH=chol(m);
> #验证结果
> t(CH)%*%CH;
[1,]
[2,]