创建数组和矩阵: 维度向量由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解决。
|
数组和矩阵操作
最新推荐文章于 2022-05-24 22:53:43 发布