Гауссовы функции и каррирование в схеме

В настоящее время я пытаюсь изучить схему для запуска моделирования FDTD, и у меня возникают проблемы с построением функции Гаусса в 2 измерениях.

На форуме нашел такую ​​возможность для 1D:

(define ( (gaussx sigma) x)
   (exp (- (/ (vector3-dot x x) (* 2 sigma sigma)))))

что, если я правильно понял каррирование, эквивалентно:

(define  (gauss sigma)
   (lambda(x)
      (exp (- (/ (vector3-dot x x) (* 2 sigma sigma))))))

Теперь я хотел бы, чтобы функция была гауссовой по направлениям x и y, но я не понимаю, почему это не работает:

(define  (gauss sigma)
   (lambda(x)
      (lambda(y)
         (exp (- (/ (+ (vector3-dot y y) (vector3-dot x x)) (* 2 sigma sigma))))

Когда я звоню

(gauss 1)

Я получаю следующее сообщение:

ERROR: Wrong type (expecting real number): # <procedure> #f (y)

Кто-нибудь видит, что я делаю неправильно? Я также пробовал другие решения, но, похоже, я не понимаю здесь логики...

Спасибо большое за вашу помощь!

С уважением Мэй


person Mei    schedule 23.01.2013    source источник


Ответы (1)


Я не думаю, что здесь нужно двойное каррирование, попробуйте следующее:

(define (gauss sigma)
  (lambda (x y)
    (exp (- (/ (+ (vector3-dot y y) (vector3-dot x x)) (* 2 sigma sigma))))))

Назовите это так:

(define gauss-1 (gauss 1))
(gauss-1 some-x some-y)

Но если вам определенно нужно двойное каррирование, это должно сработать:

(define (gauss sigma)
  (lambda (x)
    (lambda (y)
      (exp (- (/ (+ (vector3-dot y y) (vector3-dot x x)) (* 2 sigma sigma)))))))

Используя его следующим образом:

(define gauss-1 (gauss 1))
((gauss-1 some-x) some-y)
person Óscar López    schedule 23.01.2013