矩阵和数组
数组能存放多维矩形数据,“矩形”指每行的长度都相等,且每列和其它长度也是如此,矩阵是二维数组的特例
创建数组和矩阵
array
函数 创建数组 传入值和维度作为参数
three_d_array <- array(
1:24,
dim = c(4, 3, 2),
dimnames = list(
c("one", "two", "three", "four"),
c("ein", "zwei", "drei"),
c("un", "deux")
)
)
matrix
函数 创建矩阵 指定行数或列数
a_matrix <- matrix(
1:12,
nrow = 4,
dimnames = list(
c("one", "two", "three", "four"), # ncol = 3
c("ein", "zwei", "drei")
)
)
class(a_matrix)
## [1] "matrix"
矩阵也可以用array函数来构建
two_d_array <- array(
1:12,
dim = c(4, 3),
dimnames = list(
c("one", "two", "three", "four"),
c("ein", "zwei", "drei")
)
)
identical(two_d_array, a_matrix)
## [1] TRUE
class(two_d_array)
## [1] "matrix"
创建矩阵时,传入的值会按列填充矩阵,也可以指定参数byrow=TRUE
来按行填充矩阵
matrix(
1:12,
nrow=4,
byrow=T,
dimnames=list(
c("one", "two", "three", "four"),
c("ein", "zwei", "drei")
)
)
行、列和维度
dim
函数返回维度的整数值向量
dim(three_d_array)
## [1] 4 3 2
nrow
返回行数
ncol
返回列数
nrow(a_matrix)
## [1] 4
ncol(a_matrix)
## [1] 3
length
函数,返回所有维度的乘积
length(three_d_array)
## [1] 24
length(a_matrix)
## [1] 12
通过给dim函数分配一个新的维度来重塑矩阵或数组,不过它会删除原维度的名称
dim(a_matrix) <- c(6, 2)
当nrow ncol和dim作用于向量时将返回NULL值
NROW和NCOL把向量看作具有单个列的矩阵(数学意义上的列向量)
行名、列名和维度名
rownames
colnames
row.names
忽略它
dimnames
索引数组
用方括号表示索引,仍有4种指定索引的方法
- 正整数
- 负整数
- 逻辑值
- 元素的名称
可以在不同的维度上用不同的方式指定索引下标
每个维度的下标用逗号分隔
a_matix[1, c("zwei", "drei")] # 在第一行、第二列和第三列的两个元素
a_matrix[1,] # 第一行的所有元素
a_matrix[,c("zwei", "drei")] # 第二列、第三列的所有元素
合并矩阵
c
函数能在拼接矩阵前把它们转换成向量
another_matrix <- matrix(
seq.int(2, 24, 2),
nrow=4,
dimnames=list(
c("five", "six", "seven", "eight"),
c("vier", "funf", "sechs")
)
)
c(a_matrix, another_matrix)
cbind
函数, 按行绑定两个矩阵
rbind
函数, 按列绑定两个矩阵
数组算术
标准算术运算符将按元素来处理矩阵和数组
当对两个数组执行算术运算时,要确保它们的大小适当
两个数组相加时,大小必须相等
两个数组相乘时,第一个矩阵的行数必须和第二个矩阵的列数相等
向量和数组相加时,向量循环规则是成立的,但结果的维度只取自数组
t
函数转置矩阵,但不能用于转置更高维的数组
%*%
矩阵内乘
%o%
矩阵外乘
每一次,如果维度的名称存在相同的话,都取自第一个输入
^
幂运算,将作用于矩阵中的每个元素
solve
函数,矩阵求反