【问题标题】:R index numeric(0) instead of 0R索引数字(0)而不是0
【发布时间】:2018-11-18 04:03:57
【问题描述】:

这就是全部,但它仍然不起作用。我猜问题是第二个 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)

数学形式如下:

min sum(mj- m^),其中 j 从 1 到 J。

圣。

mj-1

1/(Qj-1 -Qj-2)(mj-2 -mj-1)

如果能在这里得到帮助,我将不胜感激。

【问题讨论】:

  • 你现在知道R 中的索引是从1 开始的吗? (R 不是C!)
  • @Roland 拍得好!谢谢你的评论。似乎这种行为对于 OP 来说是不需要的——因此 OP 必须重新考虑代码中的索引逻辑。
  • Delta1Delta2 是什么?在第一个 for 循环中,索引 0 存在同样的问题。
  • dvec &lt;- rep(0,J) 已过时,因为您在下一行执行dvec &lt;- -hsmoothhsmooth 是什么?

标签: r for-loop indexing


【解决方案1】:

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

所以您可能想用Q[j-1] 替换Q[j-2]

编辑:

自从我提出答案以来,问题已经发生了很大变化。问题依然存在:

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

当索引应该从 1 开始时,Wenn j1,然后 j-1 为零,Amat[0,0] 不是一个有用的表达式。

【讨论】:

  • 只是吹毛求疵:我不确定基于 1 的索引如何“更像通常的数学符号”
  • Nicking 被接受了——这不是我有史以来最出色的措辞。我的意思是:如果您查看“求和”主题下的维基百科,您会发现第一个符号是 $\sum_{i=1}^{100} i$。我的印象是,i1 开始比从零开始更常见(我可能错了)。
  • @Bernard 够公平的;-) 我首先想到的大多数数学系列都是从零开始的:几何、泰勒、指数函数……(关于它的价值,请参阅@ 987654321@ 从 0 或 1 开始的更多系列)
  • @MauritsEvers 点。无论如何,这可能花费了很多人的时间和精力,所有的编程语言都不相同,而且伪代码——在这方面——对于大多数主流语言(C++、Java、JS、Python、 ...) 或 R.
  • @Bernard 同意。我作为学生(物理学家喜欢 Fortran)开始在 Fortran(基于 1 的索引)中编码,然后在某个时候转移到 C/C++(基于 0 的索引)。我当时犯的错误(以及随后的调试会话)仍然困扰着我;-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-27
相关资源
最近更新 更多