“诊断”功能的怪异行为

时间:2018-09-22 23:26:59

标签: r matrix

有人可以解释为什么

> diag(1)

#     [,1]
#[1,]    1

> diag(c(-1,1))

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

但是

> diag(-1)
  

diag(-1)错误:无效的'nrow'值(<0)

2 个答案:

答案 0 :(得分:2)

来自?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的{​​{3}}。 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)

以这种方式,标量值必须为非负值,因为它被解释为矩阵维。

答案 1 :(得分:2)

来自?diag

  

如果x是长度为1的向量,则使用diag(x)可能会产生意想不到的效果。

     

使用diag(x,nrow = length(x))来保持一致的行为。

然后您可能需要按以下方式使用它:

diag(-1, nrow = 1)

#     [,1]
#[1,]   -1