R索引数值(0)而不是0

R索引数值(0)而不是0,r,for-loop,indexing,R,For Loop,Indexing,这就是全部,它仍然不起作用。我猜问题在于第二个Amat条件和if else结构: Dmat <- matrix(0,nrow= J, ncol=J) diag(Dmat) <- 1 dvec <- rep(0,J) dvec <- -hsmooth Aeq <- matrix(nrow= J, ncol=0) beq <- rep(0) Amat <- matrix(0,J,2*J-3) bvec <- vector(mode="numeric",

这就是全部,它仍然不起作用。我猜问题在于第二个Amat条件和if else结构:

Dmat <- matrix(0,nrow= J, ncol=J)
diag(Dmat) <- 1
dvec <- rep(0,J)
dvec <- -hsmooth
Aeq <- matrix(nrow= J, ncol=0)
beq <- rep(0)
Amat <- matrix(0,J,2*J-3)
bvec <- vector(mode="numeric", length=2*J-3)

for(j in 1:J)
{
Amat[j-1,j-1] = -1
Amat[j,j-1]   = 1
bvec[j-1]     = Delta1
}

for(j in 2:J){
Amat[j,J-1+j-2]   = -1/ (Q[j] - Q[j-1])  
if (j==2)
{Amat[j-1,J-1+j-2] = 1/(Q[j] - Q[j-1]) + 1/(Q[j-1] - 0)
}
else
{Amat[j-1,J-1+j-2] = 1/(Q[j] - Q[j-1]) + 1/(Q[j-1] - Q[j-2])
}
Amat[j-2,J-1+j-2] = -1/ (Q[j-1] - Q[j-2])
bvec[J-1+j-2]     = Delta2
}

solution1 <- solve.QP(Dmat, dvec, Amat, bvec, meq=0, factorized=FALSE)

Dmat
R
不是
C
R
中的索引以
1
开始,而不是以零开始。因此
Q
中的第一个元素是
Q[1]
。这与许多其他(
C
-启发)语言不同,但更像是通常的数学符号

因此,您可能希望将
Q[j-2]
替换为
Q[j-1]

编辑: 自从我提出我的答案以来,这个问题已经改变了很多。问题仍然存在:

for(j in 1:J)
{
    Amat[j-1,j-1] = -1
    

Wenn
j
1
,那么
j-1
是零,
Amat[0,0]
不是一个有用的表达式,当索引应该从
1

开始时,您现在知道在
R
中索引是从1开始的吗?(
R
不是
C
!)@Roland好球!谢谢你的评论。似乎OP不需要这种行为——因此OP必须重新思考代码中的索引逻辑。什么是
Delta1
Delta2
?在第一个for循环中,索引0也有同样的问题。
dvec只是吹毛求疵:我不确定基于1的索引如何“更像通常的数学表示法”。Nicking被接受-这不是我有史以来最出色的措辞。我的意思是:如果你看维基百科的“总和”主题,你会发现第一个符号是$\sum{I=1}^{100}I$。我的印象是,让
I
1
开始比从零开始更常见(我可能错了)。@Bernard Fair;-)第一次出现在我脑海中的大多数数学级数都是从零开始的:几何级数、泰勒级数、指数函数。。。(有关它的价值,请参阅更多从0或1开始的系列)@MauritsEvers Point。无论如何,它可能花费了很多人的时间和精力,所有的编程语言都不一样,伪代码——从这一方面来说——对大多数主流语言(C++、Java、JS、Python等)或
R
@Bernard都是正确的。作为一名学生(物理学家喜欢Fortran),我开始用Fortran编写代码(基于1的索引),然后在某个时候转向C/C++(基于0的索引)。我当时犯的错误(以及随后的调试会话)仍然困扰着我;-)