Я пытаюсь написать несколько разных функций, таких как стандартное отклонение и линейная регрессия в APL. Мне нужно передать список точек (x, y), но я не могу понять, как это сделать, потому что я знаю, что синтаксис функции APL позволяет передавать только 0, 1 или 2 аргумента. Есть ли какой-либо массив, который я могу использовать в APL для передачи списка в виде массива?
Это помогло бы людям ответить, если бы вы указали, какую реализацию APL вы использовали, например. APL2, APLX, Dyalog APL, GNU APL и т. д.
Есть несколько действенных способов сделать это. Например. используя два списка, один для значений x и один для значений y:
∇ c←x LinReg y
c←⌽y⌹1,[1.5]x
∇
1 3 2 LinReg 2 8 5
3 ¯1
Вы также можете передать одну матрицу, где каждая строка представляет пару (x, y):
∇ c←LinReg xy
c←⌽xy[;2]⌹1,[1.5]xy[;1]
∇
LinReg 3 2⍴1 2,3 8,2 5
3 ¯1
Если ваш APL поддерживает это, вы также можете использовать список пар (x,y). Например. в Дьялог АПЛ:
∇ c←LinReg xys
c←⌽(2⊃¨xys)⌹1,[1.5](1⊃¨xys)
∇
LinReg (1 2)(3 8)(2 5)
3 ¯1
Однако обратите внимание, что это особенно неэффективный способ представления точек в APL.
Элегантный способ решить эту проблему в APL2 — использовать присваивание векторов. Например:
A ← 42 ◊ B ← 'Hello' ◊ C ← 1 2 3 ⍝ multiple arguments A, B, and C
∇FOO ARG
[1] (A B C) ← ARG ⍝ expand arguments into individuals
[2] 'A:' A
[3] 'B:' B
[4] 'C:' C
[5] ∇
FOO (A B C)
A: 42
B: Hello
C: 1 2 3
Вы можете передать массив в качестве аргумента