2016-12-13 1 views
2

APL имеет примитивную функцию, которая используется для «декодирования» других базовых чисел. В левой части функции вы помещаете значение места, соответствующее каждой цифре, в другую базу чисел. С правой стороны вы поставите вектор цифр вы заинтересованы вЗачем нужно расшифровать APL в дополнительном номере в векторе radix?

Например:.

2 2 2 2 ⊥ 0 1 0 1 ⍝ (What you type in) Convert 0101 form base 2 into base 10 
5      ⍝ (What the interpreter computes) 

Однако, крайний левый 2 в векторе натальной никогда не используется в любом декодировании вычислений. Например,

 ¯48 2 2 2 ⊥ 0 1 0 1 ⍝ We can replace the leftmost radix digit with a random number 
5       ⍝ Same answer as before 

     ¯48 2 2 2 ⊥ 1 1 1 1 ⍝ Just to prove that the leftmost decode digit is unused 
15      ⍝ Correct decode of 1111 

     65 2 2 2 ⊥ 1 1 1 1 ⍝ Try another random number for testing 
15      ⍝ Again, the correct answer is output 

Так что, если крайняя левая цифра никогда не используется, почему на Земле требуется APL? (В частности, APL требует, чтобы вектор radix и входной вектор имели одинаковую длину). Используется ли какая-либо функция декодирования, о которой я не знаю?

+0

Возможно, он используется для проверки того, что самая левая цифра находится в диапазоне? – jasonharper

+0

Хм, хорошая мысль. Однако интерпретатор, похоже, не жалуется: '2 2 2 2 ⊥ 44 1 1 1' дает' 359' – Mahkoe

ответ

1

Ваше заявление

В частности, APL требует как ... иметь такую ​​же длину

лишь частично прав. Цитата из Dyalog APL Manual:

Х и Y созвучны, если длина последних осей X является таким же, как длина первой оси Y. Скалярным или 1-элемента вектор продолжаются до вектор требуемой длины. Если последняя ось X или первая ось Y имеет длину 1, массив расширяется вдоль этой оси, чтобы соответствовать другому аргументу.

Таким образом, это означает, что 2 ⊥ 1 1 1 1 является достаточным для вычисления 15.

Я нашел большое объяснение here, но эта страница имеет шрифт проблему, я буду воспроизводить его с соответствующим шрифтом:

С В, векторе радикса в заявлении Q←B⊥R, вычислит весовой вектор , W, в качестве первого шага оценки. Используя конкретный пример: 0 3 12 ⊥ 4 2 7 (преобразование ярдов, футы и дюймы в дюймы), вычислить весовой вектор из B следующим образом:

inches per yard: 3⊥12 or 36 
inches per foot: 12 
inches per inch: 1 

Весовой вектор 36 12 1. В APL, процесс оценки весового вектора можно записать:

 N←⍴B    ⍝ Length of B 
     W←N⍴0    ⍝ Give W the proper shape 
     W[1]←×/1↓B   ⍝ Product of all but the first element of B 
     W[2]←×/2↓B   ⍝ Product of all but the first 2 elements of B etc. 
     .    ⍝ etc. 
     . 
     . 
     W[N-1]←×/(N-1)↓B ⍝ Next to last element of W is last element of B 
     W[N]←1    ⍝ Last element of W is always I 

Обратите внимание, что первый элемент B не был использован. Для завершения оценки кодирования, взять сумму в W раз R:

 Q←+/W×R 

Этот результат B⊥R. Для нашего конкретного примера:

 36 12 1 ⊥ 4 2 7 
144 24 7 

     144 + 24 + 7 
175 
     0 3 12 ⊥ 4 2 7 
175 
+0

«Обратите внимание, что первый элемент B не использовался». Точно мое мнение; если он никогда не используется, почему он должен быть там? Это потому, что APL нуждается в нем для выравнивания памяти или что-то в этом роде? – Mahkoe

+1

Хмм, у меня нет ответа на этот вопрос, но я думаю ... * левый аргумент может использоваться для выполнения обратной операции, а _then_ имеет смысл первый элемент *, вероятно, разработчики, такие как симметрия арг ... – MBaas

0

У меня нет ничего, чтобы добавить к превосходному ответу MBaas', но я поделюсь ошибку в в APL2 на IBM мэйнфреймов относительно .

Потому что это может заинтересовать других, я поставил его в отдельный вопрос: LINK.

0

Короткий ответ заключается в том, что аргументы ⊥ должны быть совместимыми.

2 2 2 2 ⊥ 1 1 1 1  ⍝ ok 
2 2 2 2 ⊥ 1 1 1 1 1  ⍝ length error 
     2 ⊥ 1 1 1 1  ⍝ scalar extension of the left argument 
2 2 2 2 ⊥ 1    ⍝ scalar extension of the right argument 

Аргументов ⊥ распространяются на более высокие порядки массивов, а также во внутреннем продукте, последнее измерение левого аргумента должен соответствовать первому измерению права.

Смежные вопросы