数组和矩阵操作

本文介绍了R语言中数组和矩阵的基本操作,包括创建、转置、运算等,并详细讲解了scale、outer、crossprod、aperm、t、diag、solve、eigen、det、svd、qr、chol及sweep等函数的应用。

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

创建数组和矩阵:
维度向量由dim()指定,例如,z是一个由1500个元素组成的向量。下面的赋值语句
> dim(z) <- c(3,5,100)#使它具有dim属性,并且将被当作一个3X5X100
#的数组进行处理。 c(3,5,100) 就是他的维度向量。
#还可以用到像matrix()和array()这样的函数来赋值。比如
> array(1:20, dim=c(4,5))
> matrix(1:24, 3,4)
scale(x,center=TRUE,scale=TRUE)为数据对象 x按列进行中心化(center=TRUE)或标准化( center=TRUE,scale=TRUE):
例子:
x <- matrix(rnorm(10), ncol = 2)
(centered.x <- scale(x))
cov(centered.x)
数组的外积
数组一个非常重要的运算就是 外积运算outer product )。如果a b 是两个数
值数组,它们的外积将是这样的一个数组:维度向量通过连接两个操作数的维度向
(顺序非常的重要 )得到;数据向量则由 a 的数据向量元素和 b 的数据向量元素的所
有可能乘积得到。外积是通过特别的操作符 %o%实现:
一种备选的方案是,
> ab <- outer(a, b, "*")

例子:
> a<-matrix(c(1:4),2,2)
> a
[,1] [,2]
[1,] 1 3
[2,] 2 4
> b<-matrix(c(1:4),2,2)
> outer(a,b,"*")
, , 1, 1

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

, , 2, 1

[,1] [,2]
[1,] 2 6
[2,] 4 8

, , 1, 2

[,1] [,2]
[1,] 3 9
[2,] 6 12

, , 2, 2

[,1] [,2]
[1,] 4 12
[2,] 8 16

outer可以用到任何自定义双变量函数。
例如:
> f <- function(x, y) cos(y)/(1 + x^2)
> z <- outer(x, y, f)
矩阵的*、%*%、%o%的区别
*:两个矩阵对应位置相乘。
%*%:内积。
%o%:外积。
函数crossprod()
函数crossprod() 可以完成 \矢积 " crossproduct)运算,也就是说crossprod(X,y) t(X) %*% y 等价,但是在运算上更为高效。
如果crossprod() 第二个参数忽略了,它将默认和第一个参数一样,即第一个参数和自己进行运算。
函数aperm(a, perm) 可以用来重排一个数组 a
例如:
> B <- aperm(A, c(2,3,1))
解释:A是一个三维数组用A[i,j,k]表示,则c(2,3,1)表示交换i,j,k的位置,B就表示三维数组A[j,k,i]
t()
此函数用来做矩阵的转置。用例:B <- t(A)
diag()
函数diag() 的含义依赖于它的参数。当 v 是一个向量时, diag(v)返回以该向量元素为对角元素的对角矩阵。当 M 是一个矩时,diag(M) 返回 M的对角元素。这和Matlab diag() 的用法完全一致。不过有点混乱的是,如果 k 是单个值 4,那diag(k) 的结果就是 k × k 的方阵!
用例:
> diag(3)
[,1] [,2] [,3]
[1,] 1 0 0
[2,] 0 1 0
[3,] 0 0 1
> diag(c(1:3))
[,1] [,2] [,3]
[1,] 1 0 0
[2,] 0 2 0
[3,] 0 0 3
> diag(array(1:16,c(4,4)))
[1] 1 6 11 16
矩阵求逆,solve函数
> solve(A,b)
求解线性方程组,并且返回 x (可能会有一些精度丢失 )。注意,在线性代数里面该值
表示为x = A ¡1 b ,其中 A¡1表示 A inverse)。矩阵的逆可以用下面的命令计
算,
solve(A)
不过一般很少用到。在数学上,用直接求逆的办法解 x <- solve(A) %*% b相比 solve(A,b)
仅低效而且还有一种潜在的不稳定性。
用于多元计算的二次型 x0A¡1x可以通过5x %*% solve(A,x)的方式计算得到,
而不是直接计算 A 的逆。
求矩阵特征值和特征向量eigen()函数。
> 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
> eigen(a)
$values
[1] 3.620937e+01 -2.209373e+00 -1.050249e-15 8.203417e-16

$vectors
[,1] [,2] [,3] [,4]
[1,] -0.4140028 -0.82289268 0.4422036 -0.1001707
[2,] -0.4688206 -0.42193991 -0.3487083 0.5349238
[3,] -0.5236384 -0.02098714 -0.6291942 -0.7693354
[4,] -0.5784562 0.37996563 0.5356989 0.3345823
计算矩阵行列式,det()函数:
a同上:
> det(a)
[1] 2.092279e+13
矩阵奇异值分解,svd()函数:
函数svd(M) 可以把任意一个矩阵 M作为一个参数 , 且对 M 进行奇异值分解。这包括一个和 M 列空间一致的正交列 U 的矩阵,一个和 M 行空间一致的正交列 V 的矩阵,以及一个正元素 D 的对角矩阵,如 M = U %*% D %*% t(V)D 实际上以对角元素向量的形式返回。 svd(M) 的结果是由d, u v 构成的一个列表。
qr():对矩阵进行QR分解
chol():cholesky分解
sweep():数值分析批量运算符
例如:
可以使用sweep运算符给矩阵第一行加1,第二行加2,第三行加3
> m
[,1] [,2] [,3] [,4]
[1,] 1 4 7 10
[2,] 2 5 8 11
[3,] 3 6 9 12
> sweep(m,1,c(1,2,3),"+")
[,1] [,2] [,3] [,4]
[1,] 2 5 8 11
[2,] 4 7 10 13
[3,] 6 9 12 15
矩阵筛选将维,解决方法:
例子:
> a<-array(1:20, dim=c(4,5))
> m[1,]
x y
1 2
> m[1,,drop=FALSE]
x y
[1,] 1 2
在上面,第二行代码可以看到a降维了,可以设置drop=FALSE解决。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值