Странное поведение функции diag - PullRequest
0 голосов
/ 23 сентября 2018

Может кто-нибудь объяснить, почему

> diag(1)

#     [,1]
#[1,]    1

или

> diag(c(-1,1))

#     [,1] [,2]
#[1,]   -1    0
#[2,]    0    1

, но

> diag(-1)

Ошибка в diag (-1): неверный 'nrow'значение (<0) </p>

Ответы [ 2 ]

0 голосов
/ 23 сентября 2018

С ?diag:

Использование diag (x) может иметь неожиданные последствия, если x - это вектор, длина которого может быть равна единице.

Используйте diag (x, nrow = length (x)) для согласованного поведения.

Тогда вы можете использовать его следующим образом:

diag(-1, nrow = 1)

#     [,1]
#[1,]   -1
0 голосов
/ 23 сентября 2018

С ?diag:

Usage:

     diag(x = 1, nrow, ncol)

Details:

     ‘diag’ has four distinct usages:

       1. ‘x’ is a matrix, when it extracts the diagonal.

       2. ‘x’ is missing and ‘nrow’ is specified, it returns an
          identity matrix.

       3. ‘x’ is a scalar (length-one vector) and the only argument, it
          returns a square identity matrix of size given by the scalar.

       4. ‘x’ is a ‘numeric’ (‘complex’, ‘numeric’, ‘integer’,
          ‘logical’, or ‘raw’) vector, either of length at least 2 or
          there were further arguments.  This returns a matrix with the
          given diagonal and zero off-diagonal entries.

Использование 1 и 4 является наиболее однозначным, но использование 2 и 3 должно быть лучше объяснено.

Это помогает понять, если мы думаем о создании скалярная матрица с функцией diag.x - это скаляр на главной диагонали, а nrow - это размерность матрицы.

diag(2, 3)
#     [,1] [,2] [,3]
#[1,]    2    0    0
#[2,]    0    2    0
#[3,]    0    0    2

diag(-1, 2)
#     [,1] [,2]
#[1,]   -1    0
#[2,]    0   -1

Тождественная матрица является частным случаем скалярной матрицы с x = 1.

diag(1, 3)
#     [,1] [,2] [,3]
#[1,]    1    0    0
#[2,]    0    1    0
#[3,]    0    0    1

diag(1, 0)
#<0 x 0 matrix>

Эта спецификация с двумя аргументами является рекомендуемым способом генерации единичной матрицы .Но есть часто используемый ярлык с одним аргументом:

diag(3)
diag(0)

Таким образом, скалярное значение должно быть неотрицательным, поскольку оно интерпретируется как размерность матрицы.

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