R语言--矩阵篇
除此之外还可以用append函数为原有的向量添加元素
append(t,10:15)
[1] 2 543 3 5 1 10 11 12 13 14 15
Append 追加元素:
在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()。
矩阵即为数据通过组织成长与宽的表格结构来构成二维数组的形式并确保每个单元都是相同的数据类型;采用列表的方式代表不同的变量并以行的方式标记各个对象;在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与其逆矩阵进行运算时(即AA^{-1}),结果应为单位阵。但由于计算机中的计算误差可能导致非对角元素趋于零。
[,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
