1 |
a |
|
eps1 |
|
eps2 |
|
itmax |
|
vectors |
|
verbose |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 | ##---- Should be DIRECTLY executable !! ----
##-- ==> Define data, use random,
##-- or do help(data=index) for the standard data sets.
## The function is currently defined as
function (a, eps1 = 1e-06, eps2 = 1e-10, itmax = 100, vectors = TRUE,
verbose = FALSE)
{
n <- nrow(a)
k <- diag(n)
itel <- 1
mx <- 0
saa <- sum(a^2)
repeat {
for (i in 1:(n - 1)) for (j in (i + 1):n) {
aij <- a[i, j]
bij <- abs(aij)
if (bij < eps1)
next()
mx <- max(mx, bij)
am <- (a[i, i] - a[j, j])/2
u <- c(aij, -am)
u <- u/sqrt(sum(u^2))
c <- sqrt((1 + u[2])/2)
s <- sign(u[1]) * sqrt((1 - u[2])/2)
ss <- s^2
cc <- c^2
sc <- s * c
ai <- a[i, ]
aj <- a[j, ]
aii <- a[i, i]
ajj <- a[j, j]
a[i, ] <- a[, i] <- c * ai - s * aj
a[j, ] <- a[, j] <- s * ai + c * aj
a[i, j] <- a[j, i] <- 0
a[i, i] <- aii * cc + ajj * ss - 2 * sc * aij
a[j, j] <- ajj * cc + aii * ss + 2 * sc * aij
if (vectors) {
ki <- k[, i]
kj <- k[, j]
k[, i] <- c * ki - s * kj
k[, j] <- s * ki + c * kj
}
}
ff <- sqrt(saa - sum(diag(a)^2))
if (verbose)
cat("Iteration ", formatC(itel, digits = 4), "maxel ",
formatC(mx, width = 10), "loss ", formatC(ff,
width = 10), "\n")
if ((mx < eps1) || (ff < eps2) || (itel == itmax))
break()
itel <- itel + 1
mx <- 0
}
d <- diag(a)
o <- order(d, decreasing = TRUE)
if (vectors)
return(list(values = d[o], vectors = k[, o]))
else return(values = d[o])
}
|
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.