R Cran ldei:svd中的错误(V2,nu=0,nv=Unsolved):维度为零
我对R-Cran很陌生。我想解一个带约束的线性逆模型。我正在limSolve包中使用ldei函数。 以下是我的线性系统和约束: A x=C G x>=H,其中G=I,H=0。(基本上:X>=0) 其中: A在2x2矩阵中 X(nrow=2,ncol=n)是未知向量-(矩阵) C(nrow=2,ncol=n)是常数已知向量-(矩阵) 矩阵G是单位矩阵,H是具有零值的向量-(矩阵) 需要满足约束X>=0,因为X表示室外空气中二氧化氮和臭氧的浓度,并且它们不能为负值 这是我的r代码,我假设n=10:R Cran ldei:svd中的错误(V2,nu=0,nv=Unsolved):维度为零,r,svd,R,Svd,我对R-Cran很陌生。我想解一个带约束的线性逆模型。我正在limSolve包中使用ldei函数。 以下是我的线性系统和约束: A x=C G x>=H,其中G=I,H=0。(基本上:X>=0) 其中: A在2x2矩阵中 X(nrow=2,ncol=n)是未知向量-(矩阵) C(nrow=2,ncol=n)是常数已知向量-(矩阵) 矩阵G是单位矩阵,H是具有零值的向量-(矩阵) 需要满足约束X>=0,因为X表示室外空气中二氧化氮和臭氧的浓度,并且它们不能为负值 这是我的r代码,我假设n=10:
library(limSolve)
A <- matrix(data = NA, nrow=2,ncol=2)
A[1,c(1:2)] <- c(-3.956946e-05,-1.558643e-05)
A[2,c(1:2)] <- c(-8.785099e-05, 1.540414e-04)
ctmp1 <- c(-3.000286e-04,-0.0003545647,-0.0002958569,-0.000356863,-0.0003602479,-0.0004177914,-0.0004280350,-0.0003890670,-0.0004984785,-0.0005695379)
ctmp2 <- c(-6.462205e-05,-0.0007740174,-0.0006427914,-0.001056369,-0.0009569179,-0.0008562010,-0.0005402486,-0.0005043381,-0.0006366220,-0.0009332219)
inC <- rbind(ctmp1,ctmp2)
C <- matrix(data=inC, nrow=2, ncol=10)
G <- matrix(ncol=2,nrow=2,data= c(1,0,0,1))
inH <- rbind(rep(0., length.out=10),rep(0., length.out=10))
H <- matrix(data=inH, nrow=2, ncol=10)
# I am aware I need to use the apply-family instead of do loops-- this is my work in progress--..
for (i in 1:10){
print(i)
E <- A
FF <- c(C[1,i],C[2,i])
GG <- G
HH <- H[,i]
res <-ldei(E,FF,GG,HH)
print(res$X)
}
### Here the output:
[1] 1
[1] 6.326385 3.188475
[1] 2
[1] 8.93305028 0.06985077
[1] 3
[1] 7.44753875 0.07454004
[1] 4
Error in svd(V2, nu = 0, nv = unsolvable) : a dimension is zero
库(limSolve)
首先,欢迎来到R
如果您想查看某个函数的代码,只需键入该函数的名称(不带参数),R就会显示代码。所以,对于svd,我们可以看到,当没有足够的维度时,它会给出您看到的错误。。。这意味着as.矩阵(x)没有给出一个具有维度的对象,这意味着它的输入x一定不是预期的
您也可以编辑这些函数。。。用于调试目的。我通常只是粘贴到文本编辑器中,编辑并粘贴回R
svd = function (x, nu = min(n, p), nv = min(n, p), LINPACK = FALSE)
{
x <- as.matrix(x)
if (any(!is.finite(x)))
stop("infinite or missing values in 'x'")
dx <- dim(x)
n <- dx[1L]
p <- dx[2L]
if (!n || !p) {
print("x")
print(x)
print("dx")
print(dx)
print("dx1L")
print (dx[1L])
print("dx2L")
print(dx[2L])
stop("a dimension is zero");}
La.res <- La.svd(x, nu, nv)
res <- list(d = La.res$d)
if (nu)
res$u <- La.res$u
if (nv) {
if (is.complex(x))
res$v <- Conj(t(La.res$vt))
else res$v <- t(La.res$vt)
}
res
}
正如所怀疑的,输入没有数据
我在ldei中使用了相同的技巧来获得E和V2的值(这是给svd的x),我不会把代码放在这里,因为它太大了
结果是,rnd
in
V2 <- V2 %*% rnd
最终,CC的差异是因为F的值
所以我的猜测是,在FF=c(c[1,4],c[2,4])的情况下,会产生一个函数无法处理的错误
对不起,我做得再好不过了 根据Jimi提供的提示(我非常感谢),我直接联系了维护人员。下面是她“跳过”错误的建议。他们为我的案子工作
“错误意味着系统无法用ldei解决,并且函数无法捕获错误。您可以做的是:
for (i in 1:10){
print(i)
E <- A
FF <- c(C[1,i],C[2,i])
GG <- G
HH <- H[,i]
res <-try(ldei(E,FF,GG,HH))
if (! class(res)%in% "try-error")
print(res$X)
}
for(1:10中的i){
印刷品(一)
E
unsolvable <- Nx - solvable
...
rnd <- matrix(data = runif(Nx * unsolvable), nrow = Nx,
ncol = unsolvable)
[1] "CC"
[,1]
[1,] 9.570040
[2,] -1.399828
[1] "-tol"
[1] -1.490116e-08
for (i in 1:10){
print(i)
E <- A
FF <- c(C[1,i],C[2,i])
GG <- G
HH <- H[,i]
res <-try(ldei(E,FF,GG,HH))
if (! class(res)%in% "try-error")
print(res$X)
}