eigen 列拼接_R语言-强大的矩阵运算

1 矩阵基本操作

1.1创建向量

R里面有多种方法来创建向量(Vector),最简单的是用函数c()。例如:

>X=c(1,2,3,4)

>X

[1] 1 2 3 4

当然,还有别的方法。例如:

>X=1:4

>X

[1] 1 2 3 4

还有seq()函数。例如:

> X=seq(1,4,length=4)

> X

[1] 1 2 3 4

注意一点,R中的向量默认为列向量,如果要得到行向量需要对其进行转置。

1.2创建矩阵

R中创建矩阵的方法也有很多。大致分为直接创建和由其它格式转换两种方法。

1.2.1直接创建矩阵

最简单的直接创建矩阵的方法是用matrix()函数,matrix()函数的使用方法如下:

> args(matrix)

function (data = NA, nrow = 1, ncol = 1, byrow = FALSE, dimnames = NULL)

NULL

其中,data参数输入的为矩阵的元素,不能为空;nrow参数输入的是矩阵的行数,默认为1;ncol参数输入的是矩阵的列数,默认为1;byrow参数控制矩阵元素的排列方式,TRUE表示按行排列,FALSE表示按列排列,默认为FALSE;dimnames参数输入矩阵的行名和列名,可以不输入,系统默认为NULL。例如:

> matrix(1:6,nrow=2,ncol=3,byrow=FALSE)

[,1]  [,2]  [,3]

[1,]    1    3    5

[2,]    2    4    6

改变矩阵的行数和列数:

> matrix(1:6,nrow=3,ncol=2,byrow=FALSE)

[,1]   [,2]

[1,]    1    4

[2,]    2    5

[3,]    3    6

改变byrow参数:

> matrix(1:6,nrow=3,ncol=2,byrow=T)

[,1]   [,2]

[1,]    1    2

[2,]    3    4

[3,]    5    6

设定矩阵的行名和列名:

> matrix(1:6,nrow=3,ncol=2,byrow=T,dimnames=list(c(“A”,”B”,”C”),c(“boy”,”girl”)))

boy  girl

A   1    2

B   3    4

C   5    6

1.2.2 由其它格式转换

也可以由其它格式的数据转换为矩阵,此时需要用到函数as.matrix()。

1.3 查看和改变矩阵的维数

矩阵有两个维数,即行维数和列维数。在R中查看矩阵的行维数和列维数可以用函数dim()。例如:

> X=matrix(1:12,ncol=3,nrow=4)

> X

[,1] [,2] [,3]

[1,]    1    5    9

[2,]    2    6   10

[3,]    3    7   11

[4,]    4    8   12

> dim(X)

[1] 4 3

只返回行维数:

> dim(X)[1]

[1] 4

也可以用函数nrow()

> nrow(X)

[1] 4

只返回列维数:

> dim(X)[2]

[1] 3

也可以用函数ncol():

> ncol(X)

[1] 3

同时,函数dim()也可以改变矩阵的维数。例如:

> dim(X)=c(2,6)

> X

[,1]   [,2]  [,3]   [,4]  [,5]  [,6]

[1,]    1    3    5    7    9   11

[2,]    2    4    6    8   10   12

1.4矩阵行列的名称

查看矩阵的行名和列名分别用函数rownames()和函数colnames()。例如:

> X=matrix(1:6,nrow=3,ncol=2,byrow=T,dimnames=list(c(“A”,”B”,”C”),c(“boy”,”girl”)))

> X

boy girl

A   1    2

B   3    4

C   5    6

查看矩阵的行名:

> rownames(X)

[1] “A” “B” “C”

查看矩阵的列名:

> colnames(X)

[1] “boy”  “girl”

同时也可以改变矩阵的行名和列名,比如:

>  rownames(X)=c(“E”,”F”,”G”)

> X

boy girl

E   1    2

F   3    4

G   5    6

> colnames(X)=c(“man”,”woman”)

> X

man woman

E   1     2

F   3     4

G   5     6

1.5 矩阵元素的查看及其重新赋值

查看矩阵的某个特定元素,只需要知道该元素的行坐标和列坐标即可,例如:

> X=matrix(1:12,nrow=4,ncol=3)

> X

[,1] [,2] [,3]

[1,]    1    5    9

[2,]    2    6   10

[3,]    3    7   11

[4,]    4    8   12

查看位于矩阵第二行、第三列的元素:

> X[2,3]

[1] 10

也可以重新对矩阵的元素进行赋值,将矩阵第二行、第三列的元素替换为0:

> X[2,3]=0

> X

[,1] [,2] [,3]

[1,]    1    5    9

[2,]    2    6    0

[3,]    3    7   11

[4,]    4    8   12

R中有一个diag()函数可以返回矩阵的全部对角元素:

> X=matrix(1:9,ncol=3,nrow=3)

> X

[,1]   [,2]   [,3]

[1,]    1    4    7

[2,]    2    5    8

[3,]    3    6    9

> diag(X)

[1] 1 5 9

当然也可以对对角元素进行重新赋值:

> diag(X)=c(0,0,1)

> X

[,1] [,2] [,3]

[1,]    0    4    7

[2,]    2    0    8

[3,]    3    6    1

当操作对象不是对称矩阵时,diag()也可以进行操作。

> X=matrix(1:12,nrow=4,ncol=3)

> X

[,1] [,2] [,3]

[1,]    1    5    9

[2,]    2    6   10

[3,]    3    7   11

[4,]    4    8   12

> diag(X)

[1]  1  6  11

diag()函数还能用来生成对角矩阵:

> diag(c(1,2,3))

[,1] [,2] [,3]

[1,]    1    0    0

[2,]    0    2    0

[3,]    0    0    3

也可以生成单位对角矩阵:

> diag(3)

[,1] [,2] [,3]

[1,]    1    0    0

[2,]    0    1    0

[3,]    0    0    1

> diag(4)

[,1] [,2] [,3] [,4]

[1,]    1    0    0    0

[2,]    0    1    0    0

[3,]    0    0    1    0

[4,]    0    0    0    1

查看矩阵的上三角部分:在R中查看矩阵的上三角和下三角部分很简单。可以通过lower.tri()和upper.tir()来实现:

> args(lower.tri)

function (x, diag = FALSE)

NULL

> args(upper.tri)

function (x, diag = FALSE)

NULL

查看上三角:

> X=matrix(1:12,nrow=4,ncol=3)

> X

[,1] [,2] [,3]

[1,]    1    5    9

[2,]    2    6   10

[3,]    3    7   11

[4,]    4    8   12

> X[lower.tri(X)]

[1]  2  3  4  7  8 12

改变赋值:

> X[lower.tri(X)]=0

> X

[,1] [,2] [,3]

[1,]    1    5    9

[2,]    0    6   10

[3,]    0    0   11

[4,]    0    0    0

2 矩阵计算

2.1矩阵转置

R中矩阵的转置可以用t()函数完成,例如:

> X=matrix(1:12,nrow=4,ncol=3)

> X

[,1] [,2] [,3]

[1,]    1    5    9

[2,]    2    6   10

[3,]    3    7   11

[4,]    4    8   12

> t(X)

[,1] [,2] [,3] [,4]

[1,]    1    2    3    4

[2,]    5    6    7    8

[3,]    9   10   11   12

2.2矩阵的行和与列和及行平均值和列均值

在R中很容易计算一个矩阵的各行和和各列和以及各行的平均值和各列的平均值。例如:

> A=matrix(1:12,3,4)

> A

[,1] [,2] [,3] [,4]

[1,]    1    4    7   10

[2,]    2    5    8   11

[3,]    3    6    9   12

> rowSums(A)

[1] 22 26 30

> rowMeans(A)

[1] 5.5 6.5 7.5

> colSums(A)

[1]  6 15 24 33

> colMeans(A)

[1]  2  5  8 11

2.3行列式的值

R中的函数det()将计算方阵A的行列式。例如:

> X=matrix(rnorm(9),nrow=3,ncol=3)

> X

[,1]       [,2]       [,3]

[1,]  0.05810412 -1.2992698  0.5630315

[2,] -0.28070583  0.1958623 -1.8202283

[3,]  0.83691209  0.4411497  1.0014306

> det(X)

[1] 1.510076

2.4矩阵相加减

矩阵元素的相加减是指维数相同的矩阵,处于同行和同列的位置的元素进行加减。实现这个功能用“+”,“-”即可。例如:

> A=B=matrix(1:12,nrow=3,ncol=4)

> A+B

[,1] [,2] [,3] [,4]

[1,]    2    8   14   20

[2,]    4   10   16   22

[3,]    6   12   18   24

> A-B

[,1] [,2] [,3] [,4]

[1,]    0    0    0    0

[2,]    0    0    0    0

[3,]    0    0    0    0

2.5矩阵的数乘

矩阵的数乘是指一个常数与一个矩阵相乘。设A为m×n矩阵,c≠0,在R中求cA的值,可以用符号“*”。例如:

> c=2

> A=matrix(1:12,nrow=3,ncol=4)

> A

[,1] [,2] [,3] [,4]

[1,]    1    4    7   10

[2,]    2    5    8   11

[3,]    3    6    9   12

> c*A

[,1] [,2] [,3] [,4]

[1,]    2    8   14   20

[2,]    4   10   16   22

[3,]    6   12   18   24

结果矩阵与原矩阵的所有相应元素都差一个常数c。

2.6矩阵相乘

2.6.1矩阵的乘法

A为m×n矩阵,B为n×k矩阵,在R中求AB,可以符号“%*%”。例如:

> A=matrix(1:12,nrow=3,ncol=4)

> B=matrix(1:12,nrow=4,ncol=3)

> A%*%B

[,1] [,2] [,3]

[1,]   70  158  246

[2,]   80  184  288

[3,]   90  210  330

注意BA无意义,因其不符合矩阵的相乘规则。

若A为n×m矩阵,B为n×k矩阵,在R中求A’B:

> A=matrix(1:12,nrow=4,ncol=3)

> B=matrix(1:12,nrow=4,ncol=3)

> t(A)%*%B

[,1] [,2] [,3]

[1,]   30   70  110

[2,]   70  174  278

[3,]  110  278  446

也可以用函数crossprod()计算A’B:

> crossprod(A,B)

[,1] [,2] [,3]

[1,]   30   70  110

[2,]   70  174  278

[3,]  110  278  446

2.6.2矩阵的Kronecker积

n×m矩阵A和h×k矩阵B的Kronecker积是一个nh×mk维矩阵,公式为:

a­11B… a1nB

Am×n×Bh×k=……

am1B… amnB   mh×nk

在R中Kronecker积可以用函数kronecher()来计算。例如:

> A=matrix(1:4,2,2)

> A

[,1] [,2]

[1,]    1    3

[2,]    2    4

> B=matrix(rep(1,4),2,2)

> B

[,1] [,2]

[1,]    1    1

[2,]    1    1

> kronecker(A,B)

[,1] [,2] [,3] [,4]

[1,]    1    1    3    3

[2,]    1    1    3    3

[3,]    2    2    4    4

[4,]    2    2    4    4

2.7矩阵的伴随矩阵

求矩阵A的伴随矩阵可以用LoopAnalyst包中的函数make.adjoint()函数。例如:

>install.packages(“LoopAnalyst”)

> A=matrix(1:12,nrow=3,ncol=4)

> A

[,1] [,2] [,3] [,4]

[1,]    1    4    7   10

[2,]    2    5    8   11

[3,]    3    6    9   12

> make.adjoint(A)

[,1] [,2] [,3]

[1,]   -3    6   -3

[2,]    6  -12    6

[3,]   -3    6   -3

2.8矩阵的逆和广义逆

2.8.1矩阵的逆

矩阵A的逆A-1可以用函数solve(),例如:

> A=matrix(rnorm(9),nrow=3,ncol=3)

> A

[,1]       [,2]        [,3]

[1,] -0.2915845  0.2831544  0.94493154

[2,] -1.6494678  0.6999185 -0.06292334

[3,] -0.7224015 -0.3906971  0.44

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值