今天筆記內容包含R語言中矩陣和數組基礎知識。
矩陣內可以是數字、符號、數學式,類似于常見的二維數組,有m行(row)n列(col)的矩陣m×n。
R 語言的矩陣可以使用 matrix()
函數來創建,語法格式如下:matrix(data = NA, nrow = 1, ncol = 1, byrow = FALSE,dimnames = NULL)
參數說明:
data 向量,矩陣的數據
nrow 行數
ncol 列數
byrow 邏輯值,為 FALSE 按列排列,為 TRUE 按行排列
dimname 設置行和列的名稱,該參數用含有兩個向量(字符串)的列表組成。
> # 按行排列創建矩陣
> zhen_1 = matrix(c(1:12),nrow = 3,byrow = TRUE)
> print(zhen_1)
[,1] [,2] [,3] [,4]
[1,] 1 2 3 4
[2,] 5 6 7 8
[3,] 9 10 11 12
> # 定義行和列的名稱
> rownames_1 = c("a1","a2","a3")
> colnames_2 = c("b1","b2","b3","b4")
> # 輸出矩陣
> out_1 = matrix(c(1:12),nrow = 3,byrow = TRUE,dimnames = list(rownames_1,colnames_2))
> print(out_1)
b1 b2 b3 b4
a1 1 2 3 4
a2 5 6 7 8
a3 9 10 11 12
R 語言矩陣提供了t()
函數,可以實現矩陣的行列互換,變化效果如下:
我們對剛剛創建的out_1
矩陣進行轉置后輸出,如下:
> out_1 = matrix(c(1:12),nrow = 3,byrow = TRUE,dimnames = list(rownames_1,colnames_2))
> print(out_1)
b1 b2 b3 b4
a1 1 2 3 4
a2 5 6 7 8
a3 9 10 11 12
> print(t(out_1)) #輸出轉置矩陣用t()
a1 a2 a3
b1 1 5 9
b2 2 6 10
b3 3 7 11
b4 4 8 12
可以元素的列索引和行索引,類似坐標形式,獲取矩陣元素,如下:
> print(out_1) #獲取整個矩陣
b1 b2 b3 b4
a1 1 2 3 4
a2 5 6 7 8
a3 9 10 11 12
> print(out_1[1,2]) # 獲取第1行第2列的元素
[1] 2
> print(out_1[2,]) # 獲取第2行的元素
b1 b2 b3 b4
5 6 7 8
大部分人已經學過線性代數,了解矩陣的加減乘除法則,值得注意的是只有行和列數都相同的矩陣才能加減運算,只有第一個矩陣的列數等于第二個矩陣的行數才能相乘。接下來進行演示:
> # 矩陣相加,相減只需把加號改成減號
> out_sum = m_1 + m_2 # 兩個矩陣都是2×3
> cat("結果:","\n")
結果:
> print(out_sum)
[,1] [,2] [,3]
[1,] 14 -2 4
[2,] 18 8 6
> # 矩陣相乘
> out_cheng = m_1 * m_2
> cat("結果:","\n")
結果:
> print(out_cheng)
[,1] [,2] [,3]
[1,] 49 1 4
[2,] 81 16 9
> # 矩陣相除
> out_chu = m_1 / m_2
> cat("結果:","\n")
結果:
> print(out_chu)
[,1] [,2] [,3]
[1,] 1 1 1
[2,] 1 1 1
R 語言可以創建一維或多維數組,數組是一個同一類型的集合,矩陣就是一個二維數組。
數組創建使用array()
函數,該函數使用向量作為輸入參數,可以使用 dim
設置數組維度。語法格式如下:
array(data = NA, dim = length(data), dimnames = NULL)
例如創建一個3×3的二維數組,用于后續演示,方法如下:
> v1 = c(1,2,3)
> v2 = c(4,5,6,7,8,9)
> shuzu = array(c(v1,v2),dim = c(3,3,2))
> print(shuzu)
, , 1
[,1] [,2] [,3]
[1,] 1 4 7
[2,] 2 5 8
[3,] 3 6 9
, , 2
[,1] [,2] [,3]
[1,] 1 4 7
[2,] 2 5 8
[3,] 3 6 9
> column.names = c("col1","col2","col3") #設置列名
> row.names = c("row1","row2","row3") #設置行名
> matrix.names = c("m1","m2") #設置矩陣名
> out_3 = array(c(v1,v2),dim = c(3,3,2),dimnames = list(row.names,column.names,matrix.names)) #設置數組名
> print(out_3) #輸出
, , m1
col1 col2 col3
row1 1 4 7
row2 2 5 8
row3 3 6 9
, , m2
col1 col2 col3
row1 1 4 7
row2 2 5 8
row3 3 6 9
#上述m1和m2矩陣應用于筆記后面的演示,不再重復
數組的元素有坐標位置,索引順序為(行,列,維度),例如[3,2,4]
表示第4個矩陣第3行第2列的元素。
, , m2 #第二個矩陣
col1 col2 col3
row1 1 4 7
row2 2 5 8
row3 3 6 9
> print(out_3[3,1,2])
[1] 3 #輸出結果正確
可以通過訪問矩陣的元素來訪問數組,例如從數組中的一個矩陣創建新矩陣,然后進行矩陣加減運算,演示如下:
> matrix_1 = shuzu[,,1]
> matrix_2 = shuzu[,,2]
> sum_1 = matrix_1 + matrix_2
> print(sum_1)
[,1] [,2] [,3]
[1,] 2 8 14
[2,] 4 10 16
[3,] 6 12 18
apply()
函數能夠對數組跨緯度計算,語法格式為:apply(x, margin, fun)
> print(shuzu)
, , 1 #數組的第一個矩陣
[,1] [,2] [,3]
[1,] 1 4 7
[2,] 2 5 8
[3,] 3 6 9
, , 2 #數組的第二個矩陣
[,1] [,2] [,3]
[1,] 1 4 7
[2,] 2 5 8
[3,] 3 6 9
> out_4 = apply(shuzu,1,sum) #對數組所有矩陣按照每一行的方式求和
> print(out_4)
[1] 24 30 36 #第一行數據24=1+4+7+1+4+7,確實能行!
快速記憶:
# 計算數組中所有矩陣對應行的數字之和
result <- apply(shuzu, c(1), sum)
# 計算數組中所有矩陣對應列的數字之和
result <- apply(shuzu, c(2), sum)
# 計算數組中每個矩陣內部的所有數字之和
result <- apply(shuzu, c(3), sum)