заменить 0 на 1 и наоборот для диагональной матрицы в R - PullRequest
4 голосов
/ 16 июля 2010

Может кто-нибудь сказать мне, как заменить 0 на 1 и наоборот для диагональной матрицы в R.

Ответы [ 3 ]

14 голосов
/ 16 июля 2010

Если ваша матрица матовая и вы хотите перевернуть все 1 с на 0 с ...

mat <- 1-mat
0 голосов
/ 16 июля 2010

Поскольку матрицы хранятся в числовом режиме, типе 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)

изменит вашу диагональную матрицу на скалярную.

После моего скучного поста, давайте все надеяться, что он кому-то как-то помог ...

Ура!

0 голосов
/ 16 июля 2010

Я ничего не знаю о R, но похоже, что вы можете обратиться к матрице следующим образом:
http://cran.r -project.org / doc / manual / R-intro.html # Array-indexing

Я подозреваю, что вы можете решить вашу проблему, используя цикл for:
http://cran.r -project.org / doc / manual / R-intro.html # Повторяющееся выполнение

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...