R Cran ldei:svd中的错误(V2,nu = 0,nv = unsolvable):维度为零

时间:2016-02-26 11:35:06

标签: r svd

我对R-Cran很新。我想用约束求解线性逆模型。我在limSolve包中使用ldei-function。 这是我的线性系统和约束:

A x X = C

G x X> = H,G = 1且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

我非常感谢能解决这个问题的任何提示:

&#34; svd中的错误(V2,nu = 0,nv =无法解析):维度为零 &#34;

非常感谢你的帮助!

2 个答案:

答案 0 :(得分:1)

首先,欢迎来到R!

如果要查看函数的代码,只需键入函数的名称而不用paretheses,R显示代码。因此,对于svd,我们可以看到它给出了在没有足够尺寸时看到的错误...这意味着as.matrix(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
}

我已经打印出了感兴趣的价值......

[1] "x"

[1,]
[2,]
[1] "dx"
[1] 2 0
[1] "dx1L"
[1] 2
[1] "dx2L"
[1] 0

如怀疑的那样,输入没有数据......

我在ldei中使用相同的技巧来获取E和V2的值(这是给予svd的x)我不会把这些代码放在这里,因为它很大。

它的结果是<{p>}中的rnd

V2 <- V2 %*% rnd

是宽度0,因为

unsolvable <- Nx - solvable
...
rnd <- matrix(data = runif(Nx * unsolvable), nrow = Nx, 
        ncol = unsolvable)

并且Nx和solvable都等于2!

它甚至到达代码部分的原因是,在这种情况下,并非所有CC都大于-tol ......

[1] "CC"
      [,1]
[1,]  9.570040
[2,] -1.399828
[1] "-tol"
[1] -1.490116e-08

最终,CC的差异是因为F的值。

所以我的猜测是FF = c(C [1,4],C [2,4])的情况会产生一个错误,该错误不是由函数处理的。

抱歉,我做得不好!

答案 1 :(得分:0)

根据Jimi提供的提示,我非常感激,我直接联系了维护者。以下是她对&#34;跳过&#34;的建议。错误。他们为我的案子工作。

&#34;错误意味着系统无法使用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)
            }

因此,当class(res)%in%&#34; try-error&#34;时,它不可解决(可能是在请求的精度下)&#34;