Лучший способ вращать столбцы матрицы независимо - PullRequest
0 голосов
/ 16 января 2019

В рамках моего пути к изучению j я реализовал методику вычисления площади многоугольника, с которой я столкнулся в Futility Closet . Я придумала решение, но оно довольно не элегантное, поэтому меня интересуют лучшие методы:

   polyarea =: -:@((+/@((1&{&|:)*(0{&|:1&|.)))-(+/@((0&{&|:)*(1{&|:1&|.))))
   y =: 2 7 9 5 6,.5 7 1 0 4
   polyarea y
20

Этот метод вращает один столбец и берет точечное произведение столбцов, затем делает то же самое после вращения другого столбца. Площадь составляет половину разницы между этими двумя результатами.

Интересуют предложения!

1 Ответ

0 голосов
/ 16 января 2019

Я думаю, что их техника сводится к использованию определителя для определения площади многоугольника http://mathworld.wolfram.com/PolygonArea.html

Но используя технику Futility Closet, я бы сначала закрыл полигон, добавив первую точку к концу.

   y =: 2 7 9 5 6,.5 7 1 0 4
   close=: (, {.)  

close - это крюк, который берет первую пару и добавляет ее в конец

Затем возьмите детерминанты по две точки за раз, что, по сути, они и делают со своими столбцами и вращениями

   dets=: 2 (-/ . *)\ close  

dets принимает определитель каждой пары точек - результат отрицательный, если точки расположены по часовой стрелке

Затем возьмите эти значения и обработайте ответ.

   clean=: |@:-:@:(+/)   

clean суммирует детерминанты, делит на 2 и возвращает абсолютное значение результата.

   clean @: dets y
20

Чтобы увидеть результат в полной молчаливой форме, мы можем опираться на f. наречие (Fix), чтобы сгладить наши определения.

   clean @: dets f.
|@:-:@:(+/)@:(2 -/ .*\ (, {.))

Это просто другой взгляд на то, что они делают, но он позволяет J использовать соединение . (Dot Product) и наречие \ (Infix) для обработки всех этих вращений с определителями.

Надеюсь, это поможет.

...