数组和矩阵操作

创建数组和矩阵:
维度向量由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)
仅低效而且还有一种潜在的不稳定性。
用于多元计算的二次型 x 0 A ¡1 x 可以通过 5 x %*% 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解决。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值