【发布时间】:2013-12-12 11:09:51
【问题描述】:
由于某种原因,每当我运行我的函数时,我的代码中的 if 语句都会在 R 中产生一些奇怪的错误:
Error in if (P > 0) { : missing value where TRUE/FALSE needed
如果 B 是单位矩阵,我的函数应该返回对称的半正定矩阵 A 的最小特征值。我使用
测试了我的功能set.seed(12345)
a <- crossprod(matrix (rnorm(40), 10 ,4)) / 10
b <- diag(1, 4, 4)
它确实产生了正确的答案(我使用 eigen 函数进行了检查。)
无论如何,我需要将 theta 设置为最小化某个函数的值。对于我使用的示例,该值是 (-Q - sqrt(under.sqrt)) / (2 * P),但通常它取决于 P 的符号。为什么我的 if 语句会给我这样的错误?我已经被困在这里一段时间了。任何帮助,将不胜感激。
myFunction <- function(A, B, eps = 1e-6, itmax = 100, verbose = FALSE) {
n <- nrow(A)
m <- ncol(A)
x <- rep (1, n)
u <- A %*% x
v <- B %*% x
r <- t(u) %*% x
s <- t(v) %*% x
y <- r / s
itel <- 1
repeat {
tmax <- 0
for(j in 1:m) {
P <- (u[j] * B[j, j]) - (v[j] * A[j, j])
Q <- (r * B[j, j]) - (s * A[j, j])
R <- (r * v[j]) - (s * u[j])
under.sqrt <- Q^2 - 4 * P * R
# Error right here
if (P > 0) {
theta <- (-Q + sqrt(under.sqrt)) / (2 * P)
}
else {
theta <- (-Q - sqrt(under.sqrt)) / (2 * P)
}
x[j] <- x[j] + theta
r <- r + 2 * theta * u[j] + A[j, j] * theta * theta
s <- s + 2 * theta * v[j] + B[j, j] * theta * theta
u <- u + theta * A[ ,j]
v <- v + theta * B[, j]
y <- r / s
tmax <- max(tmax, abs(theta))
}
if ((tmax < eps) || (itel == itmax)) {
break()
}
itel <- itel + 1
}
return(y)
}
【问题讨论】:
-
你调用的 A 和 B 的值是多少?看起来你的代码只有在这些是方阵时才有效
-
我用过这个:
set.seed(12345)a <- crossprod(matrix (rnorm(40), 10 ,4)) / 10b <- diag(1, 4, 4) -
感谢您的所有回答。我会在凌晨 3 点 30 分以外的时候想办法……
-
x爆炸并导致P变成NaN
标签: r