в заключенииR
Языковые матричные операции, изучение матричных операций, лучший способ - смоделировать данные, затем просмотреть результаты, испытать применение функции, а затем ее можно использовать для меня.
1.1 Генерация матрицы
Создайте матрицу с 4 строками и 4 столбцами, здесь используйте числа от 1 до 16.
mat <- matrix(1:16,4,4)
mat
1 |
5 |
9 |
13 |
2 |
6 |
10 |
14 |
3 |
7 |
11 |
15 |
4 |
8 |
12 |
16 |
1.2 Извлечение главной диагонали
diag(mat)
- 1
- 6
- 11
- 16
1.3 Сгенерируйте диагональную матрицу с диагональю 1
m1 <- diag(4)
m1
1 |
0 |
0 |
0 |
0 |
1 |
0 |
0 |
0 |
0 |
1 |
0 |
0 |
0 |
0 |
1 |
1.4 Извлечение нижнего треугольника матрицы
mat[lower.tri(mat)]
- 2
- 3
- 4
- 7
- 8
- 12
1.5 Извлеките верхний треугольник матрицы
mat[upper.tri(mat)]
- 5
- 9
- 10
- 13
- 14
- 15
1.6 Построение диагональной матрицы из нижнего треугольника матрицы
mat1 <- mat
mat1[upper.tri(mat1)] <- t(mat1)[upper.tri(mat1)]
Оригинальный мат матричный:
mat
1 |
5 |
9 |
13 |
2 |
6 |
10 |
14 |
3 |
7 |
11 |
15 |
4 |
8 |
12 |
16 |
Преобразованная диагональная матрица
mat1
1 |
2 |
3 |
4 |
2 |
6 |
7 |
8 |
3 |
7 |
11 |
12 |
4 |
8 |
12 |
16 |
1.7 Преобразование матрицы в строку и столбец
Исходная матрица, формирующая три столбца: строка, столбец, значение
mat
1 |
5 |
9 |
13 |
2 |
6 |
10 |
14 |
3 |
7 |
11 |
15 |
4 |
8 |
12 |
16 |
Связанный код
nrow <- dim(mat)[1]
ncol <- dim(mat)[2]
row <- rep(1:nrow,ncol)
col <- rep(1:ncol, each=nrow)
frame <- data.frame(row,col,value =as.numeric(mat))
frame
row |
col |
value |
1 |
1 |
1 |
2 |
1 |
2 |
3 |
1 |
3 |
4 |
1 |
4 |
1 |
2 |
5 |
2 |
2 |
6 |
3 |
2 |
7 |
4 |
2 |
8 |
1 |
3 |
9 |
2 |
3 |
10 |
3 |
3 |
11 |
4 |
3 |
12 |
1 |
4 |
13 |
2 |
4 |
14 |
3 |
4 |
15 |
4 |
4 |
16 |
1.8 Преобразование формы из трех столбцов в матрицу
nrow <- max(frame[, 1])
ncol <- max(frame[, 2])
y <- rep(0, nrow * ncol)
y[(frame[, 2] - 1) * nrow + frame[, 1]] <- frame[, 3]
y[(frame[, 1] - 1) * nrow + frame[, 2]] <- frame[, 3]
matrix(y, nrow = nrow, ncol = ncol, byrow = T)
1 |
5 |
9 |
13 |
2 |
6 |
10 |
14 |
3 |
7 |
11 |
15 |
4 |
8 |
12 |
16 |
1.9 Транспонирование матрицы
t(mat)
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
2. Матричные операции
2.1 Сложение и вычитание матриц
A=B=matrix(1:16,nrow=4,ncol=4)
A + B
2 |
10 |
18 |
26 |
4 |
12 |
20 |
28 |
6 |
14 |
22 |
30 |
8 |
16 |
24 |
32 |
A - B
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
2.2 Умножение чисел и матриц
c <- 2
c*A
2 |
10 |
18 |
26 |
4 |
12 |
20 |
28 |
6 |
14 |
22 |
30 |
8 |
16 |
24 |
32 |
2.3 Умножение матриц
A представляет собой матрицу размера m × n, а B представляет собой матрицу размера n × k с использованием «%*%».
A <- matrix(1:12,3,4)
B <- matrix(1:20,4,5)
A%*%B
70 |
158 |
246 |
334 |
422 |
80 |
184 |
288 |
392 |
496 |
90 |
210 |
330 |
450 |
570 |
2.4 Метод расчета t(A)%*%B
Первый – прямой расчет
A <- matrix(1:12,3,4)
B <- matrix(1:15,3,5)
t(A)%*%B
14 |
32 |
50 |
68 |
86 |
32 |
77 |
122 |
167 |
212 |
50 |
122 |
194 |
266 |
338 |
68 |
167 |
266 |
365 |
464 |
Второй метод, использующий функцию crossprod, более эффективен при большом объеме данных.
A <- matrix(1:12,3,4)
B <- matrix(1:15,3,5)
crossprod(A,B)
14 |
32 |
50 |
68 |
86 |
32 |
77 |
122 |
167 |
212 |
50 |
122 |
194 |
266 |
338 |
68 |
167 |
266 |
365 |
464 |
2.5 Матричная инверсия
a <- matrix(rnorm(16),4,4)
solve(a)
-3.542393 |
5.8825038 |
-3.2421870 |
6.9619170 |
1.081745 |
-2.2446318 |
1.4850549 |
-2.0828270 |
-1.577580 |
2.4698567 |
-0.7070850 |
2.5241525 |
-0.830685 |
0.5105919 |
-0.3352182 |
0.5344842 |
Произведение матрицы и ее обратной является диагональной матрицей
round(solve(a)%*%a)
1 |
0 |
0 |
0 |
0 |
1 |
0 |
0 |
0 |
0 |
1 |
0 |
0 |
0 |
0 |
1 |
2.6 Обобщенные обратные матрицы
Для сингулярных матриц обратной матрицы нет, но можно вычислить ее обобщенную обратную матрицу
a <- matrix(1:16,4,4)
solve(a)
Error in solve.default(a): Lapack例行程序dgesv: 系统正好是奇异的: U[3,3] = 0
Traceback:
1. solve(a)
2. solve.default(a)
Отобразите сингулярность матрицы, здесь вы можете использовать ginv пакета MASS для вычисления ее обобщенной обратной матрицы.
library(MASS)
a <- matrix(1:16,4,4)
ginv(a)
-0.285 |
-0.1075 |
0.07 |
0.2475 |
-0.145 |
-0.0525 |
0.04 |
0.1325 |
-0.005 |
0.0025 |
0.01 |
0.0175 |
0.135 |
0.0575 |
-0.02 |
-0.0975 |
2.7 Прямое произведение матриц (Кронекера, произведение Кронекера), вычисляемое с помощью функции Кронекера
Прямой продукт A и B:A⨂B, LaTex пишет "A \bigotimes B"
Предположим, что A — матрица 2X2.
A <- matrix(c(10,5,5,20),2,2)
A
Предположим, что B — матрица 3X3.
B <- matrix(c(1,0,2,0,1,4,2,4,1),3,3)
B
Тогда прямое произведение A и B представляет собой матрицу 6X6.
kronecker(A,B)
10 |
0 |
20 |
5 |
0 |
10 |
0 |
10 |
40 |
0 |
5 |
20 |
20 |
40 |
10 |
10 |
20 |
5 |
5 |
0 |
10 |
20 |
0 |
40 |
0 |
5 |
20 |
0 |
20 |
80 |
10 |
20 |
5 |
40 |
80 |
20 |
2.8 Прямая сумма матриц
формула:A⊕B, что в LaTex означает "A\oplus B"
A <- matrix(c(1,2,3,3,2,1),2,3)
A
B <- matrix(c(1,0,6,1),2,2)
B
r1 <- dim(A)[1];c1 <- dim(A)[2]
r2 <- dim(B)[1];c2 <- dim(B)[2]
direct_sum <- rbind(cbind(A,matrix(0,r2,c2)),cbind(matrix(0,r1,c1),B))
direct_sum
1 |
3 |
2 |
0 |
0 |
2 |
3 |
1 |
0 |
0 |
0 |
0 |
0 |
1 |
6 |
0 |
0 |
0 |
0 |
1 |