【R入门】多维数组和矩阵
生成数组或矩阵
数组可以看成一个由递增下标表示的数据项的集合,例如数值.
一个矩阵就是一个2维数组
将向量定义成数组
向量只有定义了维数后,才能被看做是数组
用array()函数构造多维数组
array(data=NA,dim=length(data),dimnames=Null)
其中data是一个向量数据,dim是数组各维的长度,默认值
为原向量的长度,dimnames是数组维的名字,默认值为空
用matrix()函数构造矩阵
matrix(data = NA, nrow = 1, ncol = 1,byrow = FALSE, dimnames = NULL)
其中data是一个向量数据,nrow是矩阵的行数,ncol是矩阵的列数
默认值byrow = FALSE表示数据按列放置,如果想按行设置,设置成byrow = TRUE
dimnames是数组维的名字,默认值为空
数组下标
我们可以对数组中的某些元素进行访问
矩阵的运算
A <- matrix(1:12, nrow=4, ncol=3, byrow=T)
B <- matrix(c(1,0), nrow=3, ncol=2, byrow=T)
矩阵的转置
t()
方阵的行列式
det()
矩阵的维数
函数 dim(A) 得到矩阵A的维数
函数 nrow(A) 得到矩阵A的行数
函数 ncol(A) 得到矩阵A的列数
矩阵的拉直
设A是一个矩阵,则函数 as.vector(A) 可以将矩阵A转化为向量
数组的维名字
dimnames保存各维的各个下标的名字
x<-matrix(1:6,ncol=2,dimnames=list(c("one", "two", "three"), c("First", "Second")),byrow=T)
也可以先做矩阵,再命令
x <- matrix(1:6, ncol=2,byrow=T)
colnames(x) <- c("First", "Second")
rownames(x) <- c("one", "two", "three")
向量的内积
若x和y是相同维数的向量,则x%*%表示x与y的内积
函数 crossprod() 是内积运算
向量的外积
x%o%y
函数outer()为外积运算
矩阵的乘法
A*B 表示维数相同的A和B对应的元素的乘积
A%*%B 是一般意义的矩阵乘积
对角阵的生成和运算
函数 diag() 的作用取决于它的参数,如果v是向量,diag(v)返回一个由v的元素为对角元素的对角矩阵。
若M为矩阵,diag(M) 返回一个由M主对角元素组成的向量。
这沿用了diag() 在 Matlab中的传统用法。
此外,多少有些让人迷惑,如果k只是一个数值,那 diag(k)是一个k*k的单位矩阵。
矩阵的合并
cbind() 是把其自变量横向拼成一个大矩阵
rbind() 是把其自变量纵向拼成一个大矩阵
求解线性方程组和矩阵的拟矩阵
已知Ax=b求x,命令为solve(A,b)
求矩阵A的逆,命令是solve(A)
A<-t(array(c(1:0,10),dim=c(3,3)))
b<-c(1,1,1)
x<-solve(A,b)
B<-solve(A)
求矩阵的特征根与特征向量
函数 eigen(SM) 是求取对称矩阵SM的特征值和特征向量
命令形式ev<-eigen(SM)
则ev存放着SM的特征值与特征向量,由列表形式给出
其中 ev$ values 是SM的特征值构成的向量,ev$ vectors是特征向量构成的矩阵
A<-t(array(c(1:8,10),dim=c(3,3)))
SM<-crossprod(A,A)
ev<-eigen(SM)
ev
矩阵的奇异值分解
函数 svd(A) 是对矩阵A做奇异值分解,即A=UDt(V)
其中U和V是正交阵,D为对角阵,也就是A的奇异值
svd(A)的返回值也是列表
A<-t(array(c(1:0,10),dim=c(3,3)))
svdA<-svd(A)
svdA
u%*%diag(d)%*%t(v)