Написание двойных серий в R - PullRequest
0 голосов
/ 10 сентября 2018

Я новичок в R и столкнулся со следующей проблемой. Мне нужно преобразовать выражение из Mathematica в R. В Mathematica синтаксис следующий:

hc=-1.5;
g[x_]:=If[x<0,Ceiling[Abs[x]],Floor[x]];
Sum[f[i,j],{i,0,5},{j,0,i+Sign[hc]*g[hc]}] 

вывод следующий:

f[2,0]+f[3,0]+f[3,1]+f[4,0]+f[4,1]+f[4,2]+f[5,0]+f[5,1]+f[5,2]+f[5,3]

Теперь я пытаюсь сделать то же самое в R. Так как я ищу, как это сделать, я использую double для итерации, чтобы просто напечатать элементы, которые я буду суммировать позже.

следовательно я пишу

hcp = -1.5


ceil_floor = function (x) {
  if(x < 0) { 
    ceiling( abs(x))
    } else {
      floor(x)
    }
}

for (i in 0:5) {
  for (j in 0 : (i + (sign(hcp) * ceil_floor(hcp)))) {
    print( paste0(i,":",j) )
  }
}

который печатает:

[1] "0:0"
[1] "0:-1"
[1] "0:-2"
[1] "1:0"
[1] "1:-1"
[1] "2:0"
[1] "3:0"
[1] "3:1"
[1] "4:0"
[1] "4:1"
[1] "4:2"
[1] "5:0"
[1] "5:1"
[1] "5:2"
[1] "5:3"

Проблема здесь заключается в: 0-0,1: 0, 0: -1,0: -2,1: -1. На самом деле у меня нет проблем с отрицательными значениями, так как в конечном итоге все y будут равны нулю, но я не должен получать 0-0,1-0. Я думаю, что R обрабатывает for (i in 0:(-2)) иначе, чем mathematica.

Может кто-нибудь помочь?

Ответы [ 2 ]

0 голосов
/ 12 сентября 2018

Если вы посмотрите на таблицу Mathematica, вот так:

Table[f[i, j], {i, 0, 5}, {j, 0, i + Sign[hc]*g[hc]}]

выход:

{{}, {}, {f[2, 0]}, {f[3, 0], f[3, 1]},
 {f[4, 0], f[4, 1], f[4, 2]}, {f[5, 0], f[5, 1], f[5, 2], f[5, 3]}}

вы увидите, что из-за того, как работают итераторы Mathematica, следующие перестановки, созданные вашим R-кодом, отсутствуют и не включены в суммирование.

[1] "0:0"
[1] "0:-1"
[1] "0:-2"
[1] "1:0"
[1] "1:-1"
0 голосов
/ 10 сентября 2018

Если я правильно понял, я считаю, что вы должны написать это как for (i in (-2):0) для отрицательных значений

...