как определить n-мерное векторное вращение и отражение в haskell?

Как вообще определить вращение и отражение вектора, если функция будет работать в измерениях n в Haskell?

В настоящее время у меня есть точечный продукт, нормализация и проекция, но я застрял на отражении и вращении.

data Vector s a = Vector {len::s,arr::a}

normalize :: Vector s a → Vector s a
normalize =  toVector . uncurry (zipWith (/))
                      . (id&&&(repeat . sqrt . sum . map (^2)))
                      . fromVector

dot        :: Vector s a → Vector s a → a
dot v = sum ∘ zipWith (*) (fromVector v) ∘ fromVector

project    :: Vector s a → Vector s a → Vector s a
project v = toVector ∘ uncurry (zipWith (*))
                     ∘ (fromVector&&&(repeat ∘ (v`dot`)))

Я искал в течение нескольких дней, но кажется, что использование Haskell для понимания математики иногда может вызывать проблемы, когда нет четкого кода (или вообще нет кода), а единственные учебники по n-мерным векторам выходят за рамки моих знаний в математике.


person SANK    schedule 29.02.2016    source источник
comment
они даже компилируются? Прямо сейчас я не вижу ни sum-symbol, ни x в области видимости, если вы посмотрите на определение dot - также: речь идет только о реализации или у вас есть проблемы с поиском математики указанного операции? Если да, можете ли вы добавить ожидаемые подписи?   -  person Random Dev    schedule 29.02.2016
comment
должно быть: сумма. zipWith (*) (fromVector v).∘ fromVector мой редактор по умолчанию использует юникод, извините   -  person SANK    schedule 29.02.2016
comment
хорошо, вы должны убедить своего редактора иметь более приятное поведение при копировании и вставке - все же: вы ищете математику или у вас есть трудности с ее переводом?   -  person Random Dev    schedule 29.02.2016
comment
У меня проблемы с обоими. Я не разбираюсь в математике (я просмотрел аффинные пространства, бивекотры и т. д.... но в настоящее время ни один из них не имеет смысла), и я хотел посмотреть, есть ли способ определить это в хаскеле, поскольку это моя точка входа в математику. (+ нужны векторы для завершения SICM).   -  person SANK    schedule 29.02.2016
comment
для математики есть хороший ответ на Math.Stackexchange   -  person Random Dev    schedule 29.02.2016
comment
Почему вы так стараетесь использовать безточечный стиль? Это действительно усложнит вам жизнь.   -  person Daniel Martin    schedule 29.02.2016
comment
Бесточечный стиль предназначен только для тренировки моего ума, и проще упростить функции, поскольку все должно быть правильно спланировано. Я напишу это с нотацией do и позволю привязкам, когда буду выполнять фактическую реализацию с Data.Array.Unboxed, поскольку я хочу, чтобы это было ясно.   -  person SANK    schedule 01.03.2016


Ответы (2)


Что касается математических аспектов n-мерных вращений, я мог бы порекомендовать публикации Эндрю Дж. Хэнсона с факультета компьютерных наук Университета Индианы. Особенно:

«Повороты для N-мерной компьютерной графики» https://www.cs.indiana.edu/pub/techreports/TR406.pdf

Этот документ является преемником «Геометрии для N-мерной компьютерной графики» https://classes.soe.ucsc.edu/cmps161/Winter14/papers/pv/ggndgeom.pdf

Математика требует знания векторной арифметики и линейной алгебры, но если вы собираетесь выполнять N-мерные преобразования, это рекомендуемый способ выполнения математики.

person Bert Sierra    schedule 28.06.2017

Математика должна помочь нам в этом; вращение в n-мерном пространстве можно рассматривать как преобразование, основанное на n-2-мерном объекте (то есть точке на плоскости или линии в 3-мерном пространстве). Точно так же отражение можно рассматривать как преобразование основанный на n-1-мерном объекте.

У вас возникнут проблемы с определением поворотов для чего-то меньшего, чем трехмерный вектор, и отражения для чего-то меньшего, чем двумерный вектор. Общий подход может заключаться в определении функции двух параметров; один для вектора, который вы вращаете, и одно представление «оси» (точка для двумерного вектора).

Поскольку длина вектора (и объекта, вокруг которого он преобразуется) важна для определения того, имеют ли вообще смысл вращение или отражение, это было бы хорошим вариантом использования для зависимой типизации (вы можете указать относительную длину векторов в типе подписи). К сожалению, Haskell еще не поддерживает это в полной мере (хотя некоторые экспериментальные языки, такие как Idris, поддерживают), поэтому ваши варианты сводятся к следующему:

  • Реализуйте отражения и повороты как частичные функции, которые терпят неудачу, когда размеры векторов неверны,
  • Реализовать одну более общую функцию для преобразований вокруг любой "оси" меньшего размера (на самом деле не уверен, что это возможно),
  • Попробуйте язык с зависимыми типами (если вам нужны эти гарантии безопасности типов или
  • Проявите творческий подход к реализации

Я бы сказал, что в большинстве случаев академическая родословная Haskell делает его полезным для исследовательской математики, но он еще не идеален.

person B. Elliott    schedule 29.02.2016