有没有办法在 R 中生成一个至少有一些负特征值的矩阵?
Is there a way to generate a matrix in R with at least some negative eigenvalues?
我想生成一个至少有一些负特征值的矩阵?我正在尝试使用矩阵的谱分解来这样做,但它不能保证至少有一个负特征值
下面是一个简单的例子,可以帮助你构建这种矩阵
library(pracma)
N <- 3
U <- randortho(N, type = "orthonormal")
A <- diag(sample(c(-runif(1),rnorm(N-1)))) # ensure at least one negative eigenvalue
M <- U %*% A %*% t(U)
然后
> M
[,1] [,2] [,3]
[1,] -0.36818879 0.02406988 0.1634275
[2,] 0.02406988 -0.72613068 -0.1872272
[3,] 0.16342748 -0.18722722 -0.3116400
仔细检查特征值
> eig(M)
[1] -0.1432527 -0.4484647 -0.8142421
和
> A
[,1] [,2] [,3]
[1,] -0.1432527 0.0000000 0.0000000
[2,] 0.0000000 -0.4484647 0.0000000
[3,] 0.0000000 0.0000000 -0.8142421
如果生成随机正定矩阵并将其乘以 -1 ... 会怎么样?
在这个例子中,我将创建一个具有正对角线的下三角矩阵并将其乘以它的转置(还有很多其他方法):
set.seed(101)
m <- matrix(0,5,5)
m[lower.tri(m,diag=TRUE)] <- rnorm(15)
diag(m) <- abs(diag(m))
m2 <- m %*% t(m)
(如果你只想要半定的,你只需要确保对角线是非负的...)
是pos def吗?
v1 <- eigen(m2)$values
## [1] 5.976142640 1.908831945 0.904991040 0.037025982 0.002181558
all(v1>0) ## TRUE
检查 evals(-m2) == -evals(m2) ...
v2 <- eigen(-m2)$values
all(v2<0) ## TRUE
all.equal(sort(v1),-v2) ## TRUE
我想生成一个至少有一些负特征值的矩阵?我正在尝试使用矩阵的谱分解来这样做,但它不能保证至少有一个负特征值
下面是一个简单的例子,可以帮助你构建这种矩阵
library(pracma)
N <- 3
U <- randortho(N, type = "orthonormal")
A <- diag(sample(c(-runif(1),rnorm(N-1)))) # ensure at least one negative eigenvalue
M <- U %*% A %*% t(U)
然后
> M
[,1] [,2] [,3]
[1,] -0.36818879 0.02406988 0.1634275
[2,] 0.02406988 -0.72613068 -0.1872272
[3,] 0.16342748 -0.18722722 -0.3116400
仔细检查特征值
> eig(M)
[1] -0.1432527 -0.4484647 -0.8142421
和
> A
[,1] [,2] [,3]
[1,] -0.1432527 0.0000000 0.0000000
[2,] 0.0000000 -0.4484647 0.0000000
[3,] 0.0000000 0.0000000 -0.8142421
如果生成随机正定矩阵并将其乘以 -1 ... 会怎么样?
在这个例子中,我将创建一个具有正对角线的下三角矩阵并将其乘以它的转置(还有很多其他方法):
set.seed(101)
m <- matrix(0,5,5)
m[lower.tri(m,diag=TRUE)] <- rnorm(15)
diag(m) <- abs(diag(m))
m2 <- m %*% t(m)
(如果你只想要半定的,你只需要确保对角线是非负的...)
是pos def吗?
v1 <- eigen(m2)$values
## [1] 5.976142640 1.908831945 0.904991040 0.037025982 0.002181558
all(v1>0) ## TRUE
检查 evals(-m2) == -evals(m2) ...
v2 <- eigen(-m2)$values
all(v2<0) ## TRUE
all.equal(sort(v1),-v2) ## TRUE