R索引数值(0)而不是0
这就是全部,它仍然不起作用。我猜问题在于第二个Amat条件和if else结构: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",
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)
DmatR
不是C
。R
中的索引以1
开始,而不是以零开始。因此Q
中的第一个元素是Q[1]
。这与许多其他(C
-启发)语言不同,但更像是通常的数学符号
因此,您可能希望将Q[j-2]
替换为Q[j-1]
编辑:
自从我提出我的答案以来,这个问题已经改变了很多。问题仍然存在:
for(j in 1:J)
{
Amat[j-1,j-1] = -1
Wennj
是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的索引)。我当时犯的错误(以及随后的调试会话)仍然困扰着我;-)