R语言--矩阵篇

本文介绍了R语言中的向量操作,包括如何使用append函数追加元素,向量下标运算,逻辑运算,以及向量的替换。同时,详细探讨了矩阵的创建、转置、运算、求逆、特征值、特征向量、上三角矩阵等概念,展示了R语言处理矩阵的多种方法和函数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

除此之外还可以用append函数为原有的向量添加元素

> append(t,10:15) 

[1]   2 543   3   5   1  10  11  12  13  14  15

Append 追加元素:

追加之后原来的向量并没有改变其元素取值;缺省关键字after时表示从向量的末尾追加元素

> c <- c(1,2,3,4)

> prod(c)

[1] 24

> append(c,6:8)

[1] 1 2 3 4 6 7 8

> append(c,9:12,after=3)

[1]  1  2  3  9 10 11 12  4

> prod(c)

[1] 24

 

向量下标运算:

R语言里向量下标从1开始;

1

创建一个向量,让其每个元素加4,求其第二个元素是几?

> (c(1,3,5,7)+4)[2]

[1] 7

2

元素替换

> t

[1]   2 543   3   5   1

> t[2] <- 10>

T

[1]  2 10  3  5  1

3

 

> t

[1]   2 543   3   5   1

> t[c(1,3)] <- c(9,11)

> t

[1]  9 10 11  5  1

 

向量的逻辑运算:

> t

[1]  9 10 11  5  1

> t[t<4]   #显示出t<4的数

[1] 1

> t[t>9]#显示出t>9的数

[1] 10 11

 

把向量中所有缺省值赋值为0

新建一个向量,其中包括缺省值

> x<-c(-1,2,5,6,NA)

> x

[1] -1  2  5  6 NA

> x[is.na(x)]<-0

> x

[1] -1  2  5  6  0

 

把向量中不是NA的值导入到另一个向量中去

> x<-c(-1,2,5,6,NA)

> x

[1] -1  2  5  6 NA

> u<-x[!is.na(x)]

> u

[1] -1  2  5  6

 

将变量s设为数值型,长度为向量X的长度,则s的默认元素都是0

> x

[1] -1  2  5  6 NA

> s<-numeric(length(x))

> s

[1] 0 0 0 0 0

 

分段函数的表示方法:

 > y

[1] 1 3 5 7 9

> s<-numeric(length(y))

> s

[1] 0 0 0 0 0

> s[s<0] <- y[y<0]

> s[s>=0] <- y[y>=0] +1

> s

[1]  2  4  6  8 10

 

如果x是一个有缺失值的向量、则在对s赋值的时候会报错

> s<-numeric(length(x))

> s

[1] 0 0 0 0 0

> s[s<0] <- x[x<0]

> s[s>=0] <- x[x>=0] +1

Warning message:In s[s >= 0] <- x[x >= 0] + 1 :

  number of items to replace is not a multiple of replacement length

 

向量1-5的元素不显示:

> x <- c(1:10)

> x 

[1]  1  2  3  4  5  6  7  8  9 10

> x[-(1:5)]

[1]  6  7  8  9 10

 

 

R语言的矩阵

矩阵就是用数据排列成长和宽的表二维数组,单元必须是相同的数据类型;用列表示不同的变量,用行表示各个对象;R语言生成矩阵函数--matrix

语法:

Mymatrix <- matrix(vector,nrow=number_of_rows,ncol=number_of_columns,

Byrow=logical_value,dimnames=list(

Char_vector_rowames,char_vector_colnames))

 

第一个参数是数据;第二个参数是行数;第三个参数是列数;第四个参数表示:安行展开或者安列展开;第五个参数表示矩阵的维数;

 

> 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

> T(A)

Error: could not find function "T"

> t(A)    #矩阵的转秩 

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

[1,]    1    2    3

[2,]    4    5    6

[3,]    7    8    9

[4,]   10   11   12

> x <- 1:10

> x 

[1]  1  2  3  4  5  6  7  8  9 10

> t(x)    

       [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]

[1,]    1    2    3    4    5    6    7    8    9    10

 

矩阵的简单运算

> 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

> t(A)   

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

[1,]    1    2    3

[2,]    4    5    6

[3,]    7    8    9

[4,]   10   11   12 

> B<-A

> 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

> 3*A   

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

[1,]    3   12   21   30

[2,]    6   15   24   33

[3,]    9   18   27   36

> B <- t(A)

> #两个矩阵相乘

> A%*%B    

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

[1,]  166  188  210

[2,]  188  214  240

[3,]  210  240  270

 

求矩阵的对角线元素:

> A <- matrix(1:16,nrow=4)

> A     

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

[1,]    1    5    9   13

[2,]    2    6   10   14

[3,]    3    7   11   15

[4,]    4    8   12   16

> diag(A)

[1]  1  6 11 16

> diag(diag(A))    

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

[1,]    1    0    0    0

[2,]    0    6    0    0

[3,]    0    0   11    0

[4,]    0    0    0   16

> diag(4)  #生成对角元素值为1的单位矩阵

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

[1,]    1    0    0    0

[2,]    0    1    0    0

[3,]    0    0    1    0

[4,]    0    0    0    1

 

 

矩阵的求逆运算:solve()函数;

 

> A   

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

[1,]    1    5    9   13

[2,]    2    6   10   14

[3,]    3    7   11   15

[4,]    4    8   12   16

> solve(A) #A不是可逆的矩阵

Error in solve.default(A) :

  Lapack routine dgesv: system is exactly singular: U[3,3] = 0

 

 

#随机生成一个遵循正太分布的矩阵,避免它出现不可逆的情况,4X4的矩阵

A <- matrix(rnorm(16),4,4)

solve(A)

> A <- matrix(rnorm(16),4,4)

> A 

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

[1,] -0.70756823 -1.1234569 1.360924 -0.2375963

[2,]  1.97157201 -1.3441301 1.753795 -1.2241501

[3,] -0.08999868 -1.5231558 1.568365 -0.3278127

[4,] -0.01401725 -0.4219682 1.296756 -2.4124503

> solve(A) 

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

[1,] -0.05180593 0.4723860 -0.3259291 -0.1903122

[2,]  4.46734372 1.3701835 -5.0357807 -0.4509696

[3,]  4.70043705 1.4725733 -4.6045433 -0.5844802

[4,]  1.74551456 0.5491397 -1.5923475 -0.6487037

 

 

 

 

 

> solve(A)%*%A  

 #矩阵A和矩阵A的逆做运算应该是一个单位阵,由于计算机的计算误差出现了非对角元素趋向于0的误差

    

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

[1,]  1.000000e+00 -1.151856e-15  1.137979e-15 -2.220446e-16

[2,] -5.238865e-16  1.000000e+00  1.665335e-15 -4.440892e-16

[3,]  2.255141e-17 -2.053913e-15  1.000000e+00 -2.220446e-16

[4,] -1.387779e-17 -2.220446e-16 -3.330669e-16  1.000000e+00

 

 

求特征值和特征向量:eigen()函数

> A

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

[1,]    2    1    1    1

[2,]    1    2    1    1

[3,]    1    1    2    1

[4,]    1    1    1    2

> (A.eigen <- eigen(A,symmetric = T))

$values     #特征值就是:5,1,1,1

[1] 5 1 1 1

 

$vectors    #特征向量

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

[1,] -0.5  0.8660254  0.0000000  0.0000000

[2,] -0.5 -0.2886751 -0.5773503 -0.5773503

[3,] -0.5 -0.2886751 -0.2113249  0.7886751

[4,] -0.5 -0.2886751  0.7886751 -0.2113249

 

将矩阵变换为上三角矩阵:chol()函数

> A

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

[1,]    2    1    1    1

[2,]    1    2    1    1

[3,]    1    1    2    1

[4,]    1    1    1    2

> chol(A)

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

[1,] 1.414214 0.7071068 0.7071068 0.7071068

[2,] 0.000000 1.2247449 0.4082483 0.4082483

[3,] 0.000000 0.0000000 1.1547005 0.2886751

[4,] 0.000000 0.0000000 0.0000000 1.1180340

> t(chol(A))%*%chol(A)

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

[1,]    2    1    1    1

[2,]    1    2    1    1

[3,]    1    1    2    1

[4,]    1    1    1    2

 

如果矩阵式对称的,就可以用chol()来求行列式的值以及举证的逆

 

dim(A)对矩阵A的维数;

nrow(A)矩阵A的行数;

ncol(A)矩阵A的列数;

rowSums(A)对行求和;

colSums(A)对列求和

colMeans()对矩阵的行和列求均值

 

> A

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

[1,]    2    1    1    1

[2,]    1    2    1    1

[3,]    1    1    2    1

[4,]    1    1    1    2

> dim(A)

[1] 4 4

> nrow(A)

[1] 4

> ncol(A)

[1] 4

> rowSums(A)

[1] 5 5 5 5

> colSums(A)

[1] 5 5 5 5

 

 

 

 

 

 

 

 

 

 

 

方法一:矩阵的上三角矩阵和下三角矩阵:up.tri();low.tri();

> A<- matrix(1:16,4)

> A

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

[1,]    1    5    9   13

[2,]    2    6   10   14

[3,]    3    7   11   15

[4,]    4    8   12   16

> lower.tri(A)

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

[1,] FALSE FALSE FALSE FALSE

[2,]  TRUE FALSE FALSE FALSE

[3,]  TRUE  TRUE FALSE FALSE

[4,]  TRUE  TRUE  TRUE FALSE

> A[lower.tri(A)] <-0    #下三角矩阵

> A

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

[1,]    1    5    9   13

[2,]    0    6   10   14

[3,]    0    0   11   15

[4,]    0    0    0   16

> A[up.tri(A)]

<- 0

Error in A[up.tri(A)] <- 0 : could not find function "up.tri"

> A[upper.tri(A)] <- 0    #上三角矩阵

> A

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

[1,]    1    0    0    0

[2,]    0    6    0    0

[3,]    0    0   11    0

[4,]    0    0    0   16

> A

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

[1,]    1    0    0    0

[2,]    0    6    0    0

[3,]    0    0   11    0

[4,]    0    0    0   16

> A<- matrix(1:16,4)

> A[upper.tri(A)] <- 0

> A

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

[1,]    1    0    0    0

[2,]    2    6    0    0

[3,]    3    7   11    0

[4,]    4    8   12   16

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

> A

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

[1,]    1    0    0    0

[2,]    0    6    0    0

[3,]    0    0   11    0

[4,]    0    0    0   16

 

方法二:求矩阵的下三角阵和上三角阵

让行下标的位置小于列下表的位置的元素都为0----下三角阵;

 

> A<- matrix(1:16,4)

> A

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

[1,]    1    5    9   13

[2,]    2    6   10   14

[3,]    3    7   11   15

[4,]    4    8   12   16

> row(A)

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

[1,]    1    1    1    1

[2,]    2    2    2    2

[3,]    3    3    3    3

[4,]    4    4    4    4

> col(A)

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

[1,]    1    2    3    4

[2,]    1    2    3    4

[3,]    1    2    3    4

[4,]    1    2    3    4

> A[row(A)<col(A)]=0

> A

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

[1,]    1    0    0    0

[2,]    2    6    0    0

[3,]    3    7   11    0

[4,]    4    8   12   16

> A[row(A)>col(A)]=0

> A

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

[1,]    1    0    0    0

[2,]    0    6    0    0

[3,]    0    0   11    0

[4,]    0    0    0   16

 

矩阵中计算行列式的值:det(A)

> A

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

[1,]    1    0    0    0

[2,]    0    6    0    0

[3,]    0    0   11    0

[4,]    0    0    0   16

> det(A)

[1] 1056

 

将矩阵转化为向量化算子(这里需要编写一个小函数)

> vec<-function(x){

+   t(t(as.vector(x)))

+ }

> A<-matrix(1:12,3,4)

> vec(A)

        [,1]

 [1,]    1

 [2,]    2

 [3,]    3

 [4,]    4

 [5,]    5

 [6,]    6

 [7,]    7

 [8,]    8

 [9,]    9

[10,]   10

[11,]   11

[12,]   12

根据矩阵的下标去取元素

> A

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

[1,]    1    4    7   10

[2,]    2    5    8   11

[3,]    3    6    9   12

> A(2,3)

Error: could not find function "A"

> A[2,3]

[1] 8

> A[,3]

[1] 7 8 9

> A[2,]

[1]  2  5  8 11

> A[1:3,2]  #取出1-3行的第二列元素

[1] 4 5 6

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值