R: Почему это не работает ?, матрица, ошибка округления? - PullRequest
1 голос
/ 08 октября 2010

Почему это работает:

ncota <- 1
nslope <- 29
resul <- matrix(rep(0,ncota*nslope*4),ncota*nslope,4)

Но это не так?

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)

Полагаю, проблема в том, что деление дает нецелое число. Как я могу получить вторую работу? Мне нужно создать нулевую матрицу, размер которой рассчитывается по уравнению.

ура

Ответы [ 2 ]

5 голосов
/ 08 октября 2010

Если все, что вам нужно сделать, это создать матрицу нулей, вам не нужно указывать правильное количество нулей, просто поставьте единицу и позвольте R переработать ее до необходимой длины:

matrix(0, ncota*nslope, 4)

Причина, по которой второй отказывает, заключается в том, что ncota * nslope * 4 не совсем 116:

> (ncota * nslope * 4) == 116
[1] FALSE
> all.equal(ncota * nslope * 4, 116)
[1] TRUE

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.

и если мы сделаем, как говорится, и добавим небольшой пух, rep даст желаемое число 0:

> length(rep(0, times = ncota*nslope*4 + 0.00000001))
[1] 116

Как отметил Хэдли (в комментариях), этот фазз можно легко добавить с помощью функции zapsmall:

> length(rep(0, times = zapsmall(ncota*nslope*4)))
[1] 116
1 голос
/ 08 октября 2010

Вам не нужно использовать rep. Это работает просто отлично:

resul <- matrix(0,ncota*nslope,4)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...