blob: 1f3552b9e9cb5239c3acb0b74e7ca902e87aa378 [file] [log] [blame]
R version 3.6.2 Patched (2020-02-12 r77795) -- "Dark and Stormy Night"
Copyright (C) 2020 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.
> ## tests of R functions based on the lapack module
>
> ## NB: the signs of singular and eigenvectors are arbitrary,
> ## so there may be differences from the reference ouptut,
> ## especially when alternative BLAS are used.
>
> options(digits = 4L)
>
> ## ------- examples from ?svd ---------
>
> hilbert <- function(n) { i <- 1:n; 1 / outer(i - 1, i, "+") }
> Eps <- 100 * .Machine$double.eps
>
> ## The signs of the vectors are not determined here, so don't print
> X <- hilbert(9L)[, 1:6]
> s <- svd(X); D <- diag(s$d)
> stopifnot(abs(X - s$u %*% D %*% t(s$v)) < Eps)# X = U D V'
> stopifnot(abs(D - t(s$u) %*% X %*% s$v) < Eps)# D = U' X V
>
> ## ditto
> X <- cbind(1, 1:7)
> s <- svd(X); D <- diag(s$d)
> stopifnot(abs(X - s$u %*% D %*% t(s$v)) < Eps)# X = U D V'
> stopifnot(abs(D - t(s$u) %*% X %*% s$v) < Eps)# D = U' X V
>
> # test nu and nv
> s <- svd(X, nu = 0L)
> s <- svd(X, nu = 7L) # the last 5 columns are not determined here
> stopifnot(dim(s$u) == c(7L,7L))
> s <- svd(X, nv = 0L)
>
> # test of complex case
>
> X <- cbind(1, 1:7+(-3:3)*1i)
> s <- svd(X); D <- diag(s$d)
> stopifnot(abs(X - s$u %*% D %*% Conj(t(s$v))) < Eps)
> stopifnot(abs(D - Conj(t(s$u)) %*% X %*% s$v) < Eps)
>
>
>
> ## ------- tests of random real and complex matrices ------
> fixsign <- function(A) {
+ A[] <- apply(A, 2L, function(x) x*sign(Re(x[1L])))
+ A
+ }
> ## 100 may cause failures here.
> eigenok <- function(A, E, Eps=1000*.Machine$double.eps)
+ {
+ print(fixsign(E$vectors))
+ print(zapsmall(E$values))
+ V <- E$vectors; lam <- E$values
+ stopifnot(abs(A %*% V - V %*% diag(lam)) < Eps,
+ abs(lam[length(lam)]/lam[1]) < Eps | # this one not for singular A :
+ abs(A - V %*% diag(lam) %*% t(V)) < Eps)
+ }
>
> Ceigenok <- function(A, E, Eps=1000*.Machine$double.eps)
+ {
+ print(fixsign(E$vectors))
+ print(signif(E$values, 5))
+ V <- E$vectors; lam <- E$values
+ stopifnot(Mod(A %*% V - V %*% diag(lam)) < Eps,
+ Mod(A - V %*% diag(lam) %*% Conj(t(V))) < Eps)
+ }
>
> ## failed for some 64bit-Lapack-gcc combinations:
> sm <- cbind(1, 3:1, 1:3)
> eigenok(sm, eigen(sm))
[,1] [,2] [,3]
[1,] 0.5774 0.8452 0.9428
[2,] 0.5774 0.1690 -0.2357
[3,] 0.5774 -0.5071 -0.2357
[1] 5 1 0
> eigenok(sm, eigen(sm, sym=FALSE))
[,1] [,2] [,3]
[1,] 0.5774 0.8452 0.9428
[2,] 0.5774 0.1690 -0.2357
[3,] 0.5774 -0.5071 -0.2357
[1] 5 1 0
>
> set.seed(123)
> sm <- matrix(rnorm(25), 5, 5)
> sm <- 0.5 * (sm + t(sm))
> eigenok(sm, eigen(sm))
[,1] [,2] [,3] [,4] [,5]
[1,] 0.5899 0.1683 0.02315 0.471808 0.6329
[2,] 0.1936 0.2931 0.89217 -0.009784 -0.2838
[3,] 0.6627 -0.4812 -0.15825 0.082550 -0.5454
[4,] 0.1404 0.7985 -0.41848 0.094314 -0.3983
[5,] -0.3946 -0.1285 0.05768 0.872692 -0.2507
[1] 1.7814 1.5184 0.5833 -1.0148 -2.4908
> eigenok(sm, eigen(sm, sym=FALSE))
[,1] [,2] [,3] [,4] [,5]
[1,] 0.6329 0.5899 0.1683 0.471808 0.02315
[2,] -0.2838 0.1936 0.2931 -0.009784 0.89217
[3,] -0.5454 0.6627 -0.4812 0.082550 -0.15825
[4,] -0.3983 0.1404 0.7985 0.094314 -0.41848
[5,] -0.2507 -0.3946 -0.1285 0.872692 0.05768
[1] -2.4908 1.7814 1.5184 -1.0148 0.5833
>
> sm[] <- as.complex(sm)
> Ceigenok(sm, eigen(sm))
[,1] [,2] [,3] [,4] [,5]
[1,] 0.5899+0i 0.1683+0i 0.02315+0i 0.471808+0i 0.6329+0i
[2,] 0.1936+0i 0.2931+0i 0.89217+0i -0.009784+0i -0.2838+0i
[3,] 0.6627+0i -0.4812+0i -0.15825+0i 0.082550+0i -0.5454+0i
[4,] 0.1404+0i 0.7985+0i -0.41848+0i 0.094314+0i -0.3983+0i
[5,] -0.3946+0i -0.1285+0i 0.05768+0i 0.872692+0i -0.2507+0i
[1] 1.7814 1.5184 0.5833 -1.0148 -2.4908
> Ceigenok(sm, eigen(sm, sym=FALSE))
[,1] [,2] [,3] [,4] [,5]
[1,] 0.6329+0i 0.5899+0i 0.1683+0i 0.471808+0i 0.02315+0i
[2,] -0.2838+0i 0.1936+0i 0.2931+0i -0.009784+0i 0.89217+0i
[3,] -0.5454+0i 0.6627+0i -0.4812+0i 0.082550+0i -0.15825+0i
[4,] -0.3983+0i 0.1404+0i 0.7985+0i 0.094314+0i -0.41848+0i
[5,] -0.2507+0i -0.3946+0i -0.1285+0i 0.872692+0i 0.05768+0i
[1] -2.4908+0i 1.7814+0i 1.5184+0i -1.0148+0i 0.5833+0i
>
> sm[] <- sm + rnorm(25) * 1i
> sm <- 0.5 * (sm + Conj(t(sm)))
> Ceigenok(sm, eigen(sm))
[,1] [,2] [,3] [,4]
[1,] 0.5373+0.0000i 0.3338+0.0000i 0.02834+0.0000i 0.4378+0.0000i
[2,] 0.3051+0.0410i -0.0264-0.1175i -0.43963+0.7256i -0.0474+0.2975i
[3,] 0.3201-0.3756i 0.3379+0.4760i -0.09325-0.3281i 0.0536+0.2447i
[4,] 0.3394+0.2330i -0.1044-0.6839i 0.09966-0.3629i 0.1894+0.1979i
[5,] -0.2869+0.3483i -0.0766+0.2210i -0.14602+0.0132i 0.7449-0.1576i
[,5]
[1,] 0.6383+0.0000i
[2,] -0.1909-0.2093i
[3,] -0.4788-0.0861i
[4,] -0.3654+0.0418i
[5,] -0.2229-0.3012i
[1] 2.4043 1.3934 0.7854 -1.4050 -2.8006
> Ceigenok(sm, eigen(sm, sym=FALSE))
[,1] [,2] [,3] [,4]
[1,] 0.6383+0.0000i 0.5373+0.0000i 0.4283+0.0907i 0.0504-0.3300i
[2,] -0.1909-0.2093i 0.3051+0.0410i -0.1080+0.2813i -0.1201+0.0084i
[3,] -0.4788-0.0861i 0.3201-0.3756i 0.0018+0.2505i 0.5216-0.2622i
[4,] -0.3654+0.0418i 0.3394+0.2330i 0.1443+0.2329i -0.6918+0.0000i
[5,] -0.2229-0.3012i -0.2869+0.3483i 0.7614+0.0000i 0.2069+0.1091i
[,5]
[1,] 0.01468+0.02424i
[2,] -0.84836+0.00000i
[3,] 0.23232-0.24980i
[4,] 0.36200-0.10282i
[5,] -0.08698-0.11804i
[1] -2.8006+0i 2.4043+0i -1.4050+0i 1.3934+0i 0.7854+0i
>
>
> ## ------- tests of integer matrices -----------------
>
> set.seed(123)
> A <- matrix(rpois(25, 5), 5, 5)
>
> A %*% A
[,1] [,2] [,3] [,4] [,5]
[1,] 202 170 156 160 234
[2,] 161 124 145 147 185
[3,] 166 136 134 130 174
[4,] 218 156 169 204 234
[5,] 205 134 175 181 249
> crossprod(A)
[,1] [,2] [,3] [,4] [,5]
[1,] 226 160 153 174 240
[2,] 160 143 126 112 179
[3,] 153 126 171 137 205
[4,] 174 112 137 174 192
[5,] 240 179 205 192 293
> tcrossprod(A)
[,1] [,2] [,3] [,4] [,5]
[1,] 229 155 150 207 184
[2,] 155 144 140 184 161
[3,] 150 140 156 176 142
[4,] 207 184 176 251 209
[5,] 184 161 142 209 227
>
> solve(A)
[,1] [,2] [,3] [,4] [,5]
[1,] -0.048676 0.3390 -0.15756 -0.05892 -0.00854
[2,] -0.058711 -0.1262 0.19812 -0.03160 0.06426
[3,] 0.092656 0.2319 -0.02904 -0.12468 -0.09778
[4,] 0.062553 -0.1637 0.03800 -0.04270 0.12062
[5,] -0.002775 -0.2351 0.02391 0.22032 -0.02242
> qr(A)
$qr
[,1] [,2] [,3] [,4] [,5]
[1,] -15.0333 -10.64304 -10.1774 -11.5743 -15.965
[2,] 0.4656 -5.45212 -3.2430 2.0516 -1.667
[3,] 0.2661 0.97998 -7.5434 -3.4278 -4.920
[4,] 0.5322 -0.05761 -0.3972 4.9068 -1.269
[5,] 0.5987 -0.17944 -0.9104 -0.9086 3.088
$rank
[1] 5
$qraux
[1] 1.266 1.064 1.116 1.418 3.088
$pivot
[1] 1 2 3 4 5
attr(,"class")
[1] "qr"
> determinant(A, log = FALSE)
$modulus
[1] 9368
attr(,"logarithm")
[1] FALSE
$sign
[1] -1
attr(,"class")
[1] "det"
>
> rcond(A)
[1] 0.02466
> rcond(A, "I")
[1] 0.06007
> rcond(A, "1")
[1] 0.02466
>
> eigen(A)
eigen() decomposition
$values
[1] 29.660+0.000i -4.631+0.000i 4.556+0.000i -2.292+3.117i -2.292-3.117i
$vectors
[,1] [,2] [,3] [,4] [,5]
[1,] 0.4698+0i 0.34581+0i 0.07933+0i 0.7246+0.0000i 0.7246+0.0000i
[2,] 0.3885+0i -0.30397+0i 0.31927+0i -0.2481-0.2591i -0.2481+0.2591i
[3,] 0.3760+0i -0.03566+0i 0.70330+0i 0.0496+0.3697i 0.0496-0.3697i
[4,] 0.5029+0i -0.74239+0i -0.32651+0i -0.2262+0.1063i -0.2262-0.1063i
[5,] 0.4839+0i 0.48539+0i -0.53901+0i -0.3375-0.1752i -0.3375+0.1752i
> svd(A)
$d
[1] 29.929 6.943 6.668 3.960 1.707
$u
[,1] [,2] [,3] [,4] [,5]
[1,] -0.4659 -0.04141 -0.8795 8.440e-02 0.02379
[2,] -0.3931 0.15031 0.2249 1.824e-05 0.87881
[3,] -0.3811 0.62205 0.2170 5.570e-01 -0.33239
[4,] -0.5166 0.14296 0.1852 -7.659e-01 -0.30290
[5,] -0.4652 -0.75386 0.3073 3.097e-01 -0.15780
$v
[,1] [,2] [,3] [,4] [,5]
[1,] -0.4831 -0.3264 0.47567 -0.1955 0.6289
[2,] -0.3627 0.3731 0.53450 0.5920 -0.3051
[3,] -0.3995 0.4779 -0.59210 0.2252 0.4590
[4,] -0.3983 -0.6985 -0.36298 0.3821 -0.2752
[5,] -0.5628 0.1948 -0.07549 -0.6439 -0.4743
> La.svd(A)
$d
[1] 29.929 6.943 6.668 3.960 1.707
$u
[,1] [,2] [,3] [,4] [,5]
[1,] -0.4659 -0.04141 -0.8795 8.440e-02 0.02379
[2,] -0.3931 0.15031 0.2249 1.824e-05 0.87881
[3,] -0.3811 0.62205 0.2170 5.570e-01 -0.33239
[4,] -0.5166 0.14296 0.1852 -7.659e-01 -0.30290
[5,] -0.4652 -0.75386 0.3073 3.097e-01 -0.15780
$vt
[,1] [,2] [,3] [,4] [,5]
[1,] -0.4831 -0.3627 -0.3995 -0.3983 -0.56284
[2,] -0.3264 0.3731 0.4779 -0.6985 0.19477
[3,] 0.4757 0.5345 -0.5921 -0.3630 -0.07549
[4,] -0.1955 0.5920 0.2252 0.3821 -0.64390
[5,] 0.6289 -0.3051 0.4590 -0.2752 -0.47430
>
> As <- crossprod(A)
> E <- eigen(As)
> E$values
[1] 895.737 48.201 44.468 15.678 2.915
> abs(E$vectors) # signs vary
[,1] [,2] [,3] [,4] [,5]
[1,] 0.4831 0.3264 0.47567 0.1955 0.6289
[2,] 0.3627 0.3731 0.53450 0.5920 0.3051
[3,] 0.3995 0.4779 0.59210 0.2252 0.4590
[4,] 0.3983 0.6985 0.36298 0.3821 0.2752
[5,] 0.5628 0.1948 0.07549 0.6439 0.4743
> chol(As)
[,1] [,2] [,3] [,4] [,5]
[1,] 15.03 10.643 10.177 11.574 15.965
[2,] 0.00 5.452 3.243 -2.052 1.667
[3,] 0.00 0.000 7.543 3.428 4.920
[4,] 0.00 0.000 0.000 4.907 -1.269
[5,] 0.00 0.000 0.000 0.000 3.088
> backsolve(As, 1:5)
[1] -0.009040 -0.005129 -0.006246 0.004158 0.017065
>
> ## ------- tests of logical matrices -----------------
>
> set.seed(123)
> A <- matrix(runif(25) > 0.5, 5, 5)
>
> A %*% A
[,1] [,2] [,3] [,4] [,5]
[1,] 2 2 2 1 3
[2,] 2 1 1 2 3
[3,] 2 2 1 1 3
[4,] 2 2 2 2 4
[5,] 2 1 2 2 3
> crossprod(A)
[,1] [,2] [,3] [,4] [,5]
[1,] 3 2 1 1 3
[2,] 2 3 2 0 3
[3,] 1 2 3 1 3
[4,] 1 0 1 2 2
[5,] 3 3 3 2 5
> tcrossprod(A)
[,1] [,2] [,3] [,4] [,5]
[1,] 3 1 2 2 2
[2,] 1 3 2 3 2
[3,] 2 2 3 3 1
[4,] 2 3 3 4 2
[5,] 2 2 1 2 3
>
> Q <- qr(A)
> zapsmall(Q$qr)
[,1] [,2] [,3] [,4] [,5]
[1,] -1.7321 -1.1547 -0.5774 -0.5774 -1.7321
[2,] 0.5774 -1.2910 -1.0328 0.5164 -0.7746
[3,] 0.0000 0.7746 -1.2649 -0.9487 -0.9487
[4,] 0.5774 0.2582 0.0508 0.7071 0.7071
[5,] 0.5774 -0.5164 -0.6803 -0.3136 0.0000
> zapsmall(Q$qraux)
[1] 1.000 1.258 1.731 1.950 0.000
> determinant(A, log = FALSE) # 0
$modulus
[1] 0
attr(,"logarithm")
[1] FALSE
$sign
[1] 1
attr(,"class")
[1] "det"
>
> rcond(A)
[1] 0
> rcond(A, "I")
[1] 0
> rcond(A, "1")
[1] 0
>
> E <- eigen(A)
> zapsmall(E$values)
[1] 3.163+0.000i 0.271+0.908i 0.271-0.908i -0.705+0.000i 0.000+0.000i
> zapsmall(Mod(E$vectors))
[,1] [,2] [,3] [,4] [,5]
[1,] 0.4358 0.3604 0.3604 0.6113 0.0000
[2,] 0.4087 0.4495 0.4495 0.3771 0.5774
[3,] 0.3962 0.5870 0.5870 0.2028 0.0000
[4,] 0.5340 0.2792 0.2792 0.6649 0.5774
[5,] 0.4483 0.4955 0.4955 0.0314 0.5774
> S <- svd(A)
> zapsmall(S$d)
[1] 3.379 1.536 1.414 0.472 0.000
> S <- La.svd(A)
> zapsmall(S$d)
[1] 3.379 1.536 1.414 0.472 0.000
>
> As <- A
> As[upper.tri(A)] <- t(A)[upper.tri(A)]
> det(As)
[1] 2
> E <- eigen(As)
> E$values
[1] 3.465 1.510 0.300 -1.000 -1.275
> zapsmall(E$vectors)
[,1] [,2] [,3] [,4] [,5]
[1,] -0.4023 0.2877 0.3638 0.5 0.6108
[2,] -0.5338 -0.3474 0.5742 -0.5 -0.1207
[3,] -0.4177 -0.5380 -0.6384 0.0 0.3585
[4,] -0.4959 0.0733 -0.1273 0.5 -0.6946
[5,] -0.3644 0.7084 -0.3378 -0.5 0.0369
> solve(As)
[,1] [,2] [,3] [,4] [,5]
[1,] 0 1 -1.0 0.0 0.0
[2,] 1 1 -1.0 0.0 -1.0
[3,] -1 -1 1.5 0.5 0.5
[4,] 0 0 0.5 -0.5 0.5
[5,] 0 -1 0.5 0.5 0.5
>
> ## quite hard to come up with an example where this might make sense.
> Ac <- A; Ac[] <- as.logical(diag(5))
> chol(Ac)
[,1] [,2] [,3] [,4] [,5]
[1,] 1 0 0 0 0
[2,] 0 1 0 0 0
[3,] 0 0 1 0 0
[4,] 0 0 0 1 0
[5,] 0 0 0 0 1
>
>
>