R語言之矩陣操作和運算
阿新 • • 發佈:2019-02-10
1.轉置運算
對於矩陣A,函式t(A)表示矩陣A的轉置,如:
> A=matrix(1:6,nrow=2);
> A;
[,1] [,2] [,3]
[1,] 1 3 5
[2,] 2 4 6
> t(A);
[,1] [,2]
[1,] 1 2
[2,] 3 4
[3,] 5 6
2.求方陣的行列式
函式det()是求矩陣行列式的值,如
> det(matrix(1:4,ncol=2));
[1] -2
3.向量的內積
對於n維向量x,可以看成nxl階矩陣或lxn階矩陣。若x與y是相同
維數的向量,則x%*%Y表示x與y作內積.例如,
>x=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 50
4.向量的外積(叉積)
設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 50
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 TRUE
6.生成對角陣和矩陣取對角運算
函式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 9
7.解線性方程組和求矩陣的逆矩陣
若求解線性方程組Ax=b,其命令形式為solve(A,b),求矩陣A的逆,其命令形式為solve(A).設矩陣A=t(array(c(1:8,10),dim=c(3,3))),b<-c(1,1,1),則解方程組Ax=b的解x和求矩陣A的逆矩陣的命令如下:
> 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 1
8.求矩陣的特徵值與特徵向量
函式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
對於矩陣A,函式t(A)表示矩陣A的轉置,如:
> A=matrix(1:6,nrow=2);
> A;
[,1] [,2] [,3]
[1,] 1 3 5
[2,] 2 4 6
> t(A);
[,1] [,2]
[1,] 1 2
[2,] 3 4
[3,] 5 6
2.求方陣的行列式
函式det()是求矩陣行列式的值,如
> det(matrix(1:4,ncol=2));
[1] -2
3.向量的內積
對於n維向量x,可以看成nxl階矩陣或lxn階矩陣。若x與y是相同
維數的向量,則x%*%Y表示x與y作內積.例如,
>x=1:
>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
[,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 50
4.向量的外積(叉積)
設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 50
outer()是更為強大的外積運算函式,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 TRUE
6.生成對角陣和矩陣取對角運算
函式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 9
7.解線性方程組和求矩陣的逆矩陣
若求解線性方程組Ax=b,其命令形式為solve(A,b),求矩陣A的逆,其命令形式為solve(A).設矩陣A=t(array(c(1:8,10),dim=c(3,3))),b<-c(1,1,1),則解方程組Ax=b的解x和求矩陣A的逆矩陣的命令如下:
> 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 1
8.求矩陣的特徵值與特徵向量
函式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