有人可以解释为什么
> diag(1)
# [,1]
#[1,] 1
或
> diag(c(-1,1))
# [,1] [,2]
#[1,] -1 0
#[2,] 0 1
但是
> diag(-1)
diag(-1)错误:无效的'nrow'值(<0)
答案 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