Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/magento/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R Cran ldei:svd中的错误(V2,nu=0,nv=Unsolved):维度为零_R_Svd - Fatal编程技术网

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

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:

我对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)
            }