Поскольку матрицы хранятся в числовом режиме, типе integer / double и режиме хранения integer / double (при условии, что матрица содержит числовые значения), вы можете использовать простую индексацию в квадратных скобках для адресации в них определенных значений, например
# create dummy data
> m <- matrix(rnorm(25), 5)
> mode(m) # check mode
[1] "numeric"
> typeof(m) # check type
[1] "double"
> storage.mode(m)
[1] "double"
Теперь, чтобы создать диагональную матрицу, вы можете использовать функции lower.tri
и upper.tri
, которые возвращают логические значения для элементов матрицы ниже и выше главной диагонали соответственно.
Вы можете использовать функции lower.tri
и upper.tri
для установки недиагональных элементов на 0.
> m[lower.tri(m)] <- 0
> m[upper.tri(m)] <- 0
> m
[,1] [,2] [,3] [,4] [,5]
[1,] 0.3356640 0.0000000 0.0000000 0.000000 0.0000000
[2,] 0.0000000 -0.2940369 0.0000000 0.000000 0.0000000
[3,] 0.0000000 0.0000000 -0.4490546 0.000000 0.0000000
[4,] 0.0000000 0.0000000 0.0000000 -1.093924 0.0000000
[5,] 0.0000000 0.0000000 0.0000000 0.000000 0.3199157
Конечно, вы можете установить любую константу для элементов нижней / верхней диагонали, будь то числовые, символьные, логические, NA и т. Д.
После того, как вы установили нули как недиагональные элементы, вы можете просто использовать индексирование в квадратных скобках. Небольшое отклонение: помните, что математически векторы являются частными случаями матриц (и наоборот ), но это не означает R :
> is.vector(m)
[1] FALSE
> is.matrix(1:10)
[1] FALSE
Но, наконец, вы можете сделать:
> m[m == 0] <- 1
Это вставит 1 в матрицу везде, где встречаются нули. Вы можете использовать функцию diag
для доступа / изменения диагональных элементов, например:
> m[m == 1] <- 0
> diag(m) <- rep(pi, 5)
изменит вашу диагональную матрицу на скалярную.
После моего скучного поста, давайте все надеяться, что он кому-то как-то помог ...
Ура!