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