【问题标题】:R Cran ldei: error in svd(V2, nu = 0, nv = unsolvable) : a dimension is zeroR Cran ldei:svd 中的错误(V2,nu = 0,nv = unsolvable):维度为零
【发布时间】:2016-06-09 14:32:23
【问题描述】:

我对 R-Cran 很陌生。我想解决一个有约束的线性逆模型。我正在使用 limSolve 包中的 ldei 函数。 这是我的线性系统和约束:

A x X = C

G x X >=H,其中 G=I 且 H=0。 (基本上:X>=0)

地点:

2x2 矩阵中的 A;

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

我将非常感谢任何解决问题的提示:

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

非常感谢您的帮助!

【问题讨论】:

    标签: r svd


    【解决方案1】:

    首先,欢迎来到 R!

    如果您想查看某个函数的代码,您只需键入函数的名称,不要使用括号,然后 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)我不会把那个代码放在这里,因为它很多。

    它的结果是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]) 的情况会产生函数无法处理的错误。

    对不起,我不能做得更好!

    【讨论】:

      【解决方案2】:

      按照 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)
                  }
      

      因此,当 class(res)%in% "try-error" 时,则无法解决(可能在要求的精度下)"

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-08-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-01-25
        • 1970-01-01
        相关资源
        最近更新 更多