R:为什么这不起作用?矩阵,舍入错误?

ska*_*kan 1 r matrix

为什么这样有效:

ncota <- 1
nslope <- 29
resul <- matrix(rep(0,ncota*nslope*4),ncota*nslope,4)
Run Code Online (Sandbox Code Playgroud)

但这不是吗?

ncota <- 1
sini <- 0.1; sfin <- 1.5; spaso <- 0.05; nslope <- 1+((sfin-sini)/spaso)
resul <- matrix(rep(0,ncota*nslope*4),ncota*nslope,4)
Run Code Online (Sandbox Code Playgroud)

我想问题是该除法给出了一个非整数.如何让第二个工作?我需要创建一个零矩阵,其大小由方程计算计算得出.

干杯

Rei*_*son 5

如果你所要做的就是创建一个零矩阵,你不需要提供正确数量的零,只需提供一个零,让R将其循环到所需的长度:

matrix(0, ncota*nslope, 4)
Run Code Online (Sandbox Code Playgroud)

第二个失败的原因ncota * nslope * 4是不完全是116:

> (ncota * nslope * 4) == 116
[1] FALSE
> all.equal(ncota * nslope * 4, 116)
[1] TRUE
Run Code Online (Sandbox Code Playgroud)

all.equal如果允许浮点错误,显示这些值相等.

?rep 包括以下内容:

 Non-integer values of ‘times’ will be truncated towards zero.  If
 ‘times’ is a computed quantity it is prudent to add a small fuzz.
Run Code Online (Sandbox Code Playgroud)

如果我们按照它说的那样做并添加一个小的模糊,rep确实给出了所需的0数:

> length(rep(0, times = ncota*nslope*4 + 0.00000001))
[1] 116
Run Code Online (Sandbox Code Playgroud)

正如Hadley所述(在评论中),可以使用以下zapsmall函数轻松添加此模糊:

> length(rep(0, times = zapsmall(ncota*nslope*4)))
[1] 116
Run Code Online (Sandbox Code Playgroud)

  • 在这种情况下另一个有用的功能是`zapsmall` (2认同)