dwww Home | Show directory contents | Find package

R version 3.3.1 (2016-06-21) -- "Bug in Your Hair"
Copyright (C) 2016 The R Foundation for Statistical Computing
Platform: x86_64-pc-linux-gnu (64-bit)

R is free software and comes with ABSOLUTELY NO WARRANTY.
You are welcome to redistribute it under certain conditions.
Type 'license()' or 'licence()' for distribution details.

R is a collaborative project with many contributors.
Type 'contributors()' for more information and
'citation()' on how to cite R or R packages in publications.

Type 'demo()' for some demos, 'help()' for on-line help, or
'help.start()' for an HTML browser interface to help.
Type 'q()' to quit R.

> library( "miscTools" )
> 
> set.seed( 123 )
> 
> # not symmetric
> m1 <- matrix( rnorm( 9 ), ncol = 3 )
> print( m1 )
           [,1]       [,2]       [,3]
[1,] -0.5604756 0.07050839  0.4609162
[2,] -0.2301775 0.12928774 -1.2650612
[3,]  1.5587083 1.71506499 -0.6868529
> try( semidefiniteness( m1 ) )
Error in isSemidefinite.matrix(m = m, ...) : 
  argument 'm' must be a symmetric matrix
> try( semidefiniteness( m1, method = "eigen" ) )
Error in isSemidefinite.matrix(m = m, ...) : 
  argument 'm' must be a symmetric matrix
> try( semidefiniteness( m1, positive = FALSE ) )
Error in isSemidefinite.matrix(m = m, ...) : 
  argument 'm' must be a symmetric matrix
> try( semidefiniteness( m1, positive = FALSE, method = "eigen" ) )
Error in isSemidefinite.matrix(m = m, ...) : 
  argument 'm' must be a symmetric matrix
> 
> # positive semidefinite
> m2 <- crossprod( m1 )
> print( m2 )
          [,1]      [,2]      [,3]
[1,]  2.796686  2.604009 -1.037747
[2,]  2.604009  2.963135 -1.309056
[3,] -1.037747 -1.309056  2.284591
> semidefiniteness( m2 )
[1] TRUE
> semidefiniteness( m2, method = "eigen" )
[1] TRUE
> semidefiniteness( m2, positive = FALSE )
[1] FALSE
> semidefiniteness( m2, positive = FALSE, method = "eigen" )
[1] FALSE
> # negative semidefinite
> semidefiniteness( -m2 )
[1] FALSE
> semidefiniteness( -m2, method = "eigen" )
[1] FALSE
> semidefiniteness( -m2, positive = FALSE )
[1] TRUE
> semidefiniteness( -m2, positive = FALSE, method = "eigen" )
[1] TRUE
> 
> # positive semidefinite, singular
> m3 <- cbind( m2, - rowSums( m2 ) )
> m3 <- rbind( m3, - colSums( m3 ) )
> print( m3 )
          [,1]      [,2]        [,3]        [,4]
[1,]  2.796686  2.604009 -1.03774694 -4.36294799
[2,]  2.604009  2.963135 -1.30905572 -4.25808763
[3,] -1.037747 -1.309056  2.28459052  0.06221214
[4,] -4.362948 -4.258088  0.06221214  8.55882348
> semidefiniteness( m3 )
[1] TRUE
> semidefiniteness( m3, method = "eigen" )
[1] TRUE
> semidefiniteness( m3, positive = FALSE )
[1] FALSE
> semidefiniteness( m3, positive = FALSE, method = "eigen" )
[1] FALSE
> 
> # positive semidefinite, singular, and large numbers
> m4 <- m3 * 1e6
> print( m4 )
         [,1]     [,2]        [,3]        [,4]
[1,]  2796686  2604009 -1037746.94 -4362947.99
[2,]  2604009  2963135 -1309055.72 -4258087.63
[3,] -1037747 -1309056  2284590.52    62212.14
[4,] -4362948 -4258088    62212.14  8558823.48
> # rcond(m4)
> # det(m4)
> semidefiniteness( m4 )
[1] TRUE
> semidefiniteness( m4, method = "eigen" )
[1] TRUE
> semidefiniteness( m4, positive = FALSE )
[1] FALSE
> semidefiniteness( m4, positive = FALSE, method = "eigen" )
[1] FALSE
> 
> # negative semidefinite, diagonal
> m5 <- diag( -1, 4, 4 )
> print( m5 )
     [,1] [,2] [,3] [,4]
[1,]   -1    0    0    0
[2,]    0   -1    0    0
[3,]    0    0   -1    0
[4,]    0    0    0   -1
> semidefiniteness( m5 )
[1] FALSE
> semidefiniteness( m5, method = "eigen" )
[1] FALSE
> semidefiniteness( m5, positive = FALSE )
[1] TRUE
> semidefiniteness( m5, positive = FALSE, method = "eigen" )
[1] TRUE
> 
> # negative semidefinite, singular
> m6 <- matrix( -1, 4, 4 )
> print( m6 )
     [,1] [,2] [,3] [,4]
[1,]   -1   -1   -1   -1
[2,]   -1   -1   -1   -1
[3,]   -1   -1   -1   -1
[4,]   -1   -1   -1   -1
> semidefiniteness( m6 )
[1] FALSE
> semidefiniteness( m6, method = "eigen" )
[1] FALSE
> semidefiniteness( m6, positive = FALSE )
[1] TRUE
> semidefiniteness( m6, positive = FALSE, method = "eigen" )
[1] TRUE
> 
> # negative semidefinite, diagonal
> m7 <- diag( c( -1, -3 ) )
> print( m7 )
     [,1] [,2]
[1,]   -1    0
[2,]    0   -3
> semidefiniteness( m7 )
[1] FALSE
> semidefiniteness( m7, method = "eigen" )
[1] FALSE
> semidefiniteness( m7, positive = FALSE )
[1] TRUE
> semidefiniteness( m7, positive = FALSE, method = "eigen" )
[1] TRUE
> 
> # positive semidefinite
> m8 <- symMatrix( c( 2, -1, 0, 2, -1, 2 ) )
> print( m8 )
     [,1] [,2] [,3]
[1,]    2   -1    0
[2,]   -1    2   -1
[3,]    0   -1    2
> semidefiniteness( m8 )
[1] TRUE
> semidefiniteness( m8, method = "eigen" )
[1] TRUE
> semidefiniteness( m8, positive = FALSE )
[1] FALSE
> semidefiniteness( m8, positive = FALSE, method = "eigen" )
[1] FALSE
> 
> # indefinite
> m9 <- symMatrix( rnorm( 6 ) )
> print( m9 )
           [,1]      [,2]       [,3]
[1,] -0.4456620 1.2240818  0.3598138
[2,]  1.2240818 0.4007715  0.1106827
[3,]  0.3598138 0.1106827 -0.5558411
> semidefiniteness( m9 )
[1] FALSE
> semidefiniteness( m9, method = "eigen" )
[1] FALSE
> semidefiniteness( m9, positive = FALSE )
[1] FALSE
> semidefiniteness( m9, positive = FALSE, method = "eigen" )
[1] FALSE
> 
> # positive and negative semidefinite
> m10 <- matrix( 0, 3, 3 )
> print( m10 )
     [,1] [,2] [,3]
[1,]    0    0    0
[2,]    0    0    0
[3,]    0    0    0
> semidefiniteness( m10 )
[1] TRUE
> semidefiniteness( m10, method = "eigen" )
[1] TRUE
> semidefiniteness( m10, positive = FALSE )
[1] TRUE
> semidefiniteness( m10, positive = FALSE, method = "eigen" )
[1] TRUE
> 
> # indefinite
> m11 <- symMatrix( 1:6 )
> print( m11 )
     [,1] [,2] [,3]
[1,]    1    2    3
[2,]    2    4    5
[3,]    3    5    6
> semidefiniteness( m11 )
[1] FALSE
> semidefiniteness( m11, method = "eigen" )
[1] FALSE
> semidefiniteness( m11, positive = FALSE )
[1] FALSE
> semidefiniteness( m11, positive = FALSE, method = "eigen" )
[1] FALSE
> 
> # indefinite, singular
> m12 <- cbind( m9, - rowSums( m9 ) )
> m12 <- rbind( m12, - colSums( m12 ) )
> print( m12 )
           [,1]       [,2]        [,3]        [,4]
[1,] -0.4456620  1.2240818  0.35981383 -1.13823365
[2,]  1.2240818  0.4007715  0.11068272 -1.73553596
[3,]  0.3598138  0.1106827 -0.55584113  0.08534459
[4,] -1.1382337 -1.7355360  0.08534459  2.78842503
> semidefiniteness( m12 )
[1] FALSE
> semidefiniteness( m12, method = "eigen" )
[1] FALSE
> semidefiniteness( m12, positive = FALSE )
[1] FALSE
> semidefiniteness( m12, positive = FALSE, method = "eigen" )
[1] FALSE
> 
> # indefinite, singular, small numbers
> m13 <- m12 * 1e-6
> print( m13 )
              [,1]          [,2]          [,3]          [,4]
[1,] -4.456620e-07  1.224082e-06  3.598138e-07 -1.138234e-06
[2,]  1.224082e-06  4.007715e-07  1.106827e-07 -1.735536e-06
[3,]  3.598138e-07  1.106827e-07 -5.558411e-07  8.534459e-08
[4,] -1.138234e-06 -1.735536e-06  8.534459e-08  2.788425e-06
> semidefiniteness( m13 )
[1] FALSE
> semidefiniteness( m13, method = "eigen" )
[1] FALSE
> semidefiniteness( m13, positive = FALSE )
[1] FALSE
> semidefiniteness( m13, positive = FALSE, method = "eigen" )
[1] FALSE
> 
> # 'large' matrix
> m14 <- symMatrix( 1:( 13 * (13+1) / 2 ) )
> semidefiniteness( m14 )
[1] FALSE
> semidefiniteness( m14, method = "det" )
Warning in isSemidefinite.matrix(m = m, ...) :
  using method 'det' can take a very long time for matrices with more than 12 rows and columns; it is suggested to use method 'eigen' for larger matrices
[1] FALSE
> semidefiniteness( m14, method = "eigen" )
[1] FALSE
> 
> # list, one element not a matrix
> ml1 <- list( m2, c( m1 ), m3, m4 )
> try( semidefiniteness( ml1 ) )
Error in isSemidefinite.list(m = m, ...) : 
  all components of the list specified by argument 'm' must be matrices
> 
> # list of matrices, one non-symmetric
> ml2 <- list( m2, m1, m3, m4 )
> try( semidefiniteness( ml2 ) )
Error in isSemidefinite.matrix(m[[t]], ...) : 
  argument 'm' must be a symmetric matrix
> 
> # list of matrices, one 'large' matrix
> ml3 <- list( m2, m14, m3, m4 )
> semidefiniteness( ml3 )
[1]  TRUE FALSE  TRUE  TRUE
> semidefiniteness( ml3, method = "det" )
Warning in isSemidefinite.matrix(m[[t]], ...) :
  using method 'det' can take a very long time for matrices with more than 12 rows and columns; it is suggested to use method 'eigen' for larger matrices
[1]  TRUE FALSE  TRUE  TRUE
> semidefiniteness( ml3, method = "eigen" )
[1]  TRUE FALSE  TRUE  TRUE
> semidefiniteness( ml3, positive = FALSE )
[1] FALSE FALSE FALSE FALSE
> semidefiniteness( ml3, positive = FALSE, method = "det" )
Warning in isSemidefinite.matrix(m[[t]], ...) :
  using method 'det' can take a very long time for matrices with more than 12 rows and columns; it is suggested to use method 'eigen' for larger matrices
[1] FALSE FALSE FALSE FALSE
> semidefiniteness( ml3, positive = FALSE, method = "eigen" )
[1] FALSE FALSE FALSE FALSE
> 
> proc.time()
   user  system elapsed 
  0.268   0.020   0.312 

Generated by dwww version 1.15 on Wed Jun 26 00:51:44 CEST 2024.