生成数组或矩阵
数组(array) 可以看成是带多个下标的类型相同的元素的集合,常用的是数值型的数组如矩阵,也可以有其它类型(如字符型、逻辑型、复数型)
数组有一个特征属性叫做维数向量(dim属性)
向量定义成数组
向量只有定义了维数向量(dim属性)才能看作是数组
向量定义成一维数组
用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, 生成的矩阵按行放置 缺省时相当于byrow=FALSE, 生成的矩阵按列放置 |
dimnames=NULL | 是数组维的名字,缺省时为空 |
3行5列矩阵,按行存放
3行5列矩阵,按列存放
数组下标
通过数组下标对数组元素进行访问,或进行运算
常规数组下标
访问指定元素
a[2,1,3]
第一个数值:行数; 第二各数值:列数; 第三个数值:维数
得到 m*n 数组
a[1, 2:3, 2:3]
[,1] [,2]
[1,] 9 15
[2,] 11 17
省略某一维的下标,表示该维全选
a[1, , ]
[,1] [,2] [,3] [,4]
[1,] 1 7 13 19
[2,] 3 9 15 21
[3,] 5 11 17 23
a[ , 2, ]
[,1] [,2] [,3] [,4]
[1,] 3 9 15 21
[2,] 4 10 16 22
a[1,1, ]
[1] 1 7 13 19
整个数组
a[]
特殊下标
对于数组只用一个下标向量(是向量,不是数组),这时忽略数组的维数信息表达式,看作是对数组的数据向量取子集
a[3:10]
不规则的数组下标
用一个二维数组作为数组的下标,二维数组的每一行是一个元素的下标,列数为数组的为数组的维数
数组的四则运算
形状一致的向量(数组)四则运算
加 +
减 -
乘 *
除 /
形状不一致的向量(数组)四则运算
规则是将向量(或数组)中的数据与对应向量(或数组)中的数据进行运算,把短向量(或数组)的数据循环使用,从而可以与长向量(或数组)数据进行匹配,并尽可能保留共同的数组属性
矩阵运算
转置预算 t()
矩阵A,函数t(A)表示矩阵A的转置,即
A
T
A^T
AT
方阵的行列式 det()
- n阶方阵:是一个n行n列的数表,而n阶行列式就是由这样一个n行n列的数表按一定的运算确定出的一个数。
- 方阵A的行列式,记
|A|
或detA
,由n阶方阵A的元素构成的行列式 - 只有方阵才有行列式的概念,若A是行数与列数不等的矩阵,则A没有行列式的定义
向量的内积 %*%
与 crossprod()
%*%
crossprod(x,y)
crossprod(x)
表示 x与x的内积,即
∥
x
∥
2
2
\parallel x \parallel^2_2
∥x∥22
向量的外积(叉积) %o%
与 outer()
%o%
x与y的外积
outer(x,y)
x与y的外积
tcrossprod(x,y)
x与y的外积,表示 x %*% t(y)
tcrossprod(x)
x与x的外积
矩阵的乘法
矩阵中对应元素的乘积(矩阵A和B具有相同的维数)
A * B
矩阵的乘积(矩阵A的列数等于矩阵B的行数)
A %*% B
crossprod(A,B)
表示的是 t(A) %*% B
tcrossprod(A,B)
表示的是 A %*% t(B)
生成对角阵和矩阵取对角 diag()
diag(向量
表示以向量元素为对角线元素的对角阵
diag(矩阵)
表示取矩阵对角线上的元素的向量
解线性方程组 和 矩阵的逆矩阵 solve()
解线性方程组
A
x
=
b
Ax = b
Ax=b, 其命令形式为 solve(A,b)
{
x
1
+
2
x
2
+
3
x
3
=
1
4
x
1
+
5
x
2
+
6
x
3
=
1
7
x
1
+
8
x
2
+
10
x
3
=
1
\left\{ \begin{array}{c} x_1+ 2x_2 +3x_3=1 \\ 4x_1+ 5x_2+6x_3=1 \\ 7x_1+ 8x_2+10x_3=1 \\ \end{array} \right.
⎩⎨⎧x1+2x2+3x3=14x1+5x2+6x3=17x1+8x2+10x3=1
即
A
=
[
1
2
3
4
5
6
7
8
10
]
A=\left[ \begin{array}{ccc} 1& 2& 3 \\ 4& 5& 6 \\ 7& 8& 10 \end{array} \right ]
A=⎣⎡1472583610⎦⎤ ,
b
=
[
1
1
1
]
b=\left[ \begin{array}{cc} 1 \\ 1 \\ 1 \end{array} \right ]
b=⎣⎡111⎦⎤
solve(A,b)
矩阵A的逆矩阵 solve(A)
对称矩阵的特征值与特征向量 eigen()
对称矩阵
eigen(Sm)
特征向量 ev$vectors
特征值 ev$values
矩阵的奇异值分解 svd()
A
=
U
D
V
T
A = UDV^T
A=UDVT,其中U,V是正交阵,D为对角阵,也就是A的奇异值。
svd(A)
返回的是列表
svd(A)$d
表示矩阵A的奇异值,即矩阵D的对角线上的元素
svd(A)$u
正交阵U
svd(A)$v
正交阵V
最小拟合与QR分解 lsfit()
与 qr()
y是观测值
x | 0.0 | 0.2 | 0.4 | 0.6 | 0.8 |
---|---|---|---|---|---|
y | 0.9 | 1.9 | 2.8 | 3.3 | 4.2 |
lsfit(x,y)
返回值是最小二乘拟合的结果
QR分解函数 qr()
,输入的矩阵需要加以1为元素的列,其返回值是列表
qr.coef(Xplus,y)
计算最小二乘的系数
得到最小二乘的拟合值
得到最小二乘的残差值
与矩阵(数组)运算有关的函数
获取矩阵的维数 dim()
与nrow()
与ncol()
dim()
得到矩阵A的维数
nrow()
得到矩阵A的行数
ncol()
得到矩阵A的列数
矩阵的合并 cbind()
与 rbind()
rbind()
把自变量纵向拼成一个大矩阵,自变量是矩阵或看作行向量的向量时,自变量的宽度应该相等,如果参与合并的自变量比其变量短,则循环补足后合并。
cbind()
把自变量横向拼成一个大矩阵,自变量是矩阵或看作列向量的向量时,自变量的高度应该相等.
如果参与合并的自变量比其变量短,则循环补足后合并.
矩阵的拉直 as.vector()
as.vector(A)
将矩阵转化为向量
数组的维名字 dimnames()
定义时赋值
X <- matrix(1:6, ncol=2, dimnames=list(c("one","two","three"), c("First","Second")), byrow=T); X
后赋值
X <- matrix(1:6, ncol=2, byrow=T); X
dimnames(X) <- list(c("one","two","three"), c("First","Second"))
属性 colnames
和 rownames
访问或者赋值 行名与列名
数组的广义转置 aperm()
aperm(A, perm)
把数组A的各维按 perm 中指定的新次序重新排列
构造一个 2行3列4维的数组
perm=c(2,3,1)
表示原来行的个数变成了维度的个数,即原来每个矩阵有两行,则现在维度是2;原来列是三列,现在变成行数为三行;原来维度为四,现在列的个数为四.
矩阵A, 矩阵转置
A
T
A^T
AT:
即 t(A)
相当于 aperm(A,c(2,1))
数组某一维(或若干维)进行计算 apply()
apply(A, MARGIN, FUN, ...)
参数 | 描述 |
---|---|
A | 数组 |
MARGIN | 固定哪些维不变 |
FUN | 用来计算的函数 |
按行计算,MARGIN=1
按列计算,MARGIN=2