1 2R version 3.3.1 (2016-06-21) -- "Bug in Your Hair" 3Copyright (C) 2016 The R Foundation for Statistical Computing 4Platform: x86_64-pc-linux-gnu (64-bit) 5 6R is free software and comes with ABSOLUTELY NO WARRANTY. 7You are welcome to redistribute it under certain conditions. 8Type 'license()' or 'licence()' for distribution details. 9 10R is a collaborative project with many contributors. 11Type 'contributors()' for more information and 12'citation()' on how to cite R or R packages in publications. 13 14Type 'demo()' for some demos, 'help()' for on-line help, or 15'help.start()' for an HTML browser interface to help. 16Type 'q()' to quit R. 17 18> library( "miscTools" ) 19> 20> set.seed( 123 ) 21> 22> # not symmetric 23> m1 <- matrix( rnorm( 9 ), ncol = 3 ) 24> print( m1 ) 25 [,1] [,2] [,3] 26[1,] -0.5604756 0.07050839 0.4609162 27[2,] -0.2301775 0.12928774 -1.2650612 28[3,] 1.5587083 1.71506499 -0.6868529 29> try( semidefiniteness( m1 ) ) 30Error in isSemidefinite.matrix(m = m, ...) : 31 argument 'm' must be a symmetric matrix 32> try( semidefiniteness( m1, method = "eigen" ) ) 33Error in isSemidefinite.matrix(m = m, ...) : 34 argument 'm' must be a symmetric matrix 35> try( semidefiniteness( m1, positive = FALSE ) ) 36Error in isSemidefinite.matrix(m = m, ...) : 37 argument 'm' must be a symmetric matrix 38> try( semidefiniteness( m1, positive = FALSE, method = "eigen" ) ) 39Error in isSemidefinite.matrix(m = m, ...) : 40 argument 'm' must be a symmetric matrix 41> 42> # positive semidefinite 43> m2 <- crossprod( m1 ) 44> print( m2 ) 45 [,1] [,2] [,3] 46[1,] 2.796686 2.604009 -1.037747 47[2,] 2.604009 2.963135 -1.309056 48[3,] -1.037747 -1.309056 2.284591 49> semidefiniteness( m2 ) 50[1] TRUE 51> semidefiniteness( m2, method = "eigen" ) 52[1] TRUE 53> semidefiniteness( m2, positive = FALSE ) 54[1] FALSE 55> semidefiniteness( m2, positive = FALSE, method = "eigen" ) 56[1] FALSE 57> # negative semidefinite 58> semidefiniteness( -m2 ) 59[1] FALSE 60> semidefiniteness( -m2, method = "eigen" ) 61[1] FALSE 62> semidefiniteness( -m2, positive = FALSE ) 63[1] TRUE 64> semidefiniteness( -m2, positive = FALSE, method = "eigen" ) 65[1] TRUE 66> 67> # positive semidefinite, singular 68> m3 <- cbind( m2, - rowSums( m2 ) ) 69> m3 <- rbind( m3, - colSums( m3 ) ) 70> print( m3 ) 71 [,1] [,2] [,3] [,4] 72[1,] 2.796686 2.604009 -1.03774694 -4.36294799 73[2,] 2.604009 2.963135 -1.30905572 -4.25808763 74[3,] -1.037747 -1.309056 2.28459052 0.06221214 75[4,] -4.362948 -4.258088 0.06221214 8.55882348 76> semidefiniteness( m3 ) 77[1] TRUE 78> semidefiniteness( m3, method = "eigen" ) 79[1] TRUE 80> semidefiniteness( m3, positive = FALSE ) 81[1] FALSE 82> semidefiniteness( m3, positive = FALSE, method = "eigen" ) 83[1] FALSE 84> 85> # positive semidefinite, singular, and large numbers 86> m4 <- m3 * 1e6 87> print( m4 ) 88 [,1] [,2] [,3] [,4] 89[1,] 2796686 2604009 -1037746.94 -4362947.99 90[2,] 2604009 2963135 -1309055.72 -4258087.63 91[3,] -1037747 -1309056 2284590.52 62212.14 92[4,] -4362948 -4258088 62212.14 8558823.48 93> # rcond(m4) 94> # det(m4) 95> semidefiniteness( m4 ) 96[1] TRUE 97> semidefiniteness( m4, method = "eigen" ) 98[1] TRUE 99> semidefiniteness( m4, positive = FALSE ) 100[1] FALSE 101> semidefiniteness( m4, positive = FALSE, method = "eigen" ) 102[1] FALSE 103> 104> # negative semidefinite, diagonal 105> m5 <- diag( -1, 4, 4 ) 106> print( m5 ) 107 [,1] [,2] [,3] [,4] 108[1,] -1 0 0 0 109[2,] 0 -1 0 0 110[3,] 0 0 -1 0 111[4,] 0 0 0 -1 112> semidefiniteness( m5 ) 113[1] FALSE 114> semidefiniteness( m5, method = "eigen" ) 115[1] FALSE 116> semidefiniteness( m5, positive = FALSE ) 117[1] TRUE 118> semidefiniteness( m5, positive = FALSE, method = "eigen" ) 119[1] TRUE 120> 121> # negative semidefinite, singular 122> m6 <- matrix( -1, 4, 4 ) 123> print( m6 ) 124 [,1] [,2] [,3] [,4] 125[1,] -1 -1 -1 -1 126[2,] -1 -1 -1 -1 127[3,] -1 -1 -1 -1 128[4,] -1 -1 -1 -1 129> semidefiniteness( m6 ) 130[1] FALSE 131> semidefiniteness( m6, method = "eigen" ) 132[1] FALSE 133> semidefiniteness( m6, positive = FALSE ) 134[1] TRUE 135> semidefiniteness( m6, positive = FALSE, method = "eigen" ) 136[1] TRUE 137> 138> # negative semidefinite, diagonal 139> m7 <- diag( c( -1, -3 ) ) 140> print( m7 ) 141 [,1] [,2] 142[1,] -1 0 143[2,] 0 -3 144> semidefiniteness( m7 ) 145[1] FALSE 146> semidefiniteness( m7, method = "eigen" ) 147[1] FALSE 148> semidefiniteness( m7, positive = FALSE ) 149[1] TRUE 150> semidefiniteness( m7, positive = FALSE, method = "eigen" ) 151[1] TRUE 152> 153> # positive semidefinite 154> m8 <- symMatrix( c( 2, -1, 0, 2, -1, 2 ) ) 155> print( m8 ) 156 [,1] [,2] [,3] 157[1,] 2 -1 0 158[2,] -1 2 -1 159[3,] 0 -1 2 160> semidefiniteness( m8 ) 161[1] TRUE 162> semidefiniteness( m8, method = "eigen" ) 163[1] TRUE 164> semidefiniteness( m8, positive = FALSE ) 165[1] FALSE 166> semidefiniteness( m8, positive = FALSE, method = "eigen" ) 167[1] FALSE 168> 169> # indefinite 170> m9 <- symMatrix( rnorm( 6 ) ) 171> print( m9 ) 172 [,1] [,2] [,3] 173[1,] -0.4456620 1.2240818 0.3598138 174[2,] 1.2240818 0.4007715 0.1106827 175[3,] 0.3598138 0.1106827 -0.5558411 176> semidefiniteness( m9 ) 177[1] FALSE 178> semidefiniteness( m9, method = "eigen" ) 179[1] FALSE 180> semidefiniteness( m9, positive = FALSE ) 181[1] FALSE 182> semidefiniteness( m9, positive = FALSE, method = "eigen" ) 183[1] FALSE 184> 185> # positive and negative semidefinite 186> m10 <- matrix( 0, 3, 3 ) 187> print( m10 ) 188 [,1] [,2] [,3] 189[1,] 0 0 0 190[2,] 0 0 0 191[3,] 0 0 0 192> semidefiniteness( m10 ) 193[1] TRUE 194> semidefiniteness( m10, method = "eigen" ) 195[1] TRUE 196> semidefiniteness( m10, positive = FALSE ) 197[1] TRUE 198> semidefiniteness( m10, positive = FALSE, method = "eigen" ) 199[1] TRUE 200> 201> # indefinite 202> m11 <- symMatrix( 1:6 ) 203> print( m11 ) 204 [,1] [,2] [,3] 205[1,] 1 2 3 206[2,] 2 4 5 207[3,] 3 5 6 208> semidefiniteness( m11 ) 209[1] FALSE 210> semidefiniteness( m11, method = "eigen" ) 211[1] FALSE 212> semidefiniteness( m11, positive = FALSE ) 213[1] FALSE 214> semidefiniteness( m11, positive = FALSE, method = "eigen" ) 215[1] FALSE 216> 217> # indefinite, singular 218> m12 <- cbind( m9, - rowSums( m9 ) ) 219> m12 <- rbind( m12, - colSums( m12 ) ) 220> print( m12 ) 221 [,1] [,2] [,3] [,4] 222[1,] -0.4456620 1.2240818 0.35981383 -1.13823365 223[2,] 1.2240818 0.4007715 0.11068272 -1.73553596 224[3,] 0.3598138 0.1106827 -0.55584113 0.08534459 225[4,] -1.1382337 -1.7355360 0.08534459 2.78842503 226> semidefiniteness( m12 ) 227[1] FALSE 228> semidefiniteness( m12, method = "eigen" ) 229[1] FALSE 230> semidefiniteness( m12, positive = FALSE ) 231[1] FALSE 232> semidefiniteness( m12, positive = FALSE, method = "eigen" ) 233[1] FALSE 234> 235> # indefinite, singular, small numbers 236> m13 <- m12 * 1e-6 237> print( m13 ) 238 [,1] [,2] [,3] [,4] 239[1,] -4.456620e-07 1.224082e-06 3.598138e-07 -1.138234e-06 240[2,] 1.224082e-06 4.007715e-07 1.106827e-07 -1.735536e-06 241[3,] 3.598138e-07 1.106827e-07 -5.558411e-07 8.534459e-08 242[4,] -1.138234e-06 -1.735536e-06 8.534459e-08 2.788425e-06 243> semidefiniteness( m13 ) 244[1] FALSE 245> semidefiniteness( m13, method = "eigen" ) 246[1] FALSE 247> semidefiniteness( m13, positive = FALSE ) 248[1] FALSE 249> semidefiniteness( m13, positive = FALSE, method = "eigen" ) 250[1] FALSE 251> 252> # 'large' matrix 253> m14 <- symMatrix( 1:( 13 * (13+1) / 2 ) ) 254> semidefiniteness( m14 ) 255[1] FALSE 256> semidefiniteness( m14, method = "det" ) 257Warning in isSemidefinite.matrix(m = m, ...) : 258 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 259[1] FALSE 260> semidefiniteness( m14, method = "eigen" ) 261[1] FALSE 262> 263> # list, one element not a matrix 264> ml1 <- list( m2, c( m1 ), m3, m4 ) 265> try( semidefiniteness( ml1 ) ) 266Error in isSemidefinite.list(m = m, ...) : 267 all components of the list specified by argument 'm' must be matrices 268> 269> # list of matrices, one non-symmetric 270> ml2 <- list( m2, m1, m3, m4 ) 271> try( semidefiniteness( ml2 ) ) 272Error in isSemidefinite.matrix(m[[t]], ...) : 273 argument 'm' must be a symmetric matrix 274> 275> # list of matrices, one 'large' matrix 276> ml3 <- list( m2, m14, m3, m4 ) 277> semidefiniteness( ml3 ) 278[1] TRUE FALSE TRUE TRUE 279> semidefiniteness( ml3, method = "det" ) 280Warning in isSemidefinite.matrix(m[[t]], ...) : 281 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 282[1] TRUE FALSE TRUE TRUE 283> semidefiniteness( ml3, method = "eigen" ) 284[1] TRUE FALSE TRUE TRUE 285> semidefiniteness( ml3, positive = FALSE ) 286[1] FALSE FALSE FALSE FALSE 287> semidefiniteness( ml3, positive = FALSE, method = "det" ) 288Warning in isSemidefinite.matrix(m[[t]], ...) : 289 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 290[1] FALSE FALSE FALSE FALSE 291> semidefiniteness( ml3, positive = FALSE, method = "eigen" ) 292[1] FALSE FALSE FALSE FALSE 293> 294> proc.time() 295 user system elapsed 296 0.268 0.020 0.312 297