green_fr (green_fr) wrote,
green_fr
green_fr

Category:

APL vs MatLab

Курс программирования на УБЗ. Глава 5. Часть 1. A Programming Language или Уроки Практической Магии.

Удивительно, но я не только не знал до сих пор APL, но и услышал о нём, мне кажется, впервые. Хотя, как можно было не выучить язык, на котором программа выглядит следующим образом:

(((1,A)/B)⌊1+⍴Y)[(⍴Y)↓(+\1,A←(1↓A)≠¯1↓A←A[B])[⍋B←⍋A←Y,X]]

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

1. «⍳x» — это, очевидно, «1 : x». Даже «⍳0» эквивалентно «1 : 0» в том смысле, что оба возвращают «ничто». От себя замечу, что в Матлабе не бывает просто «ничего», оно всегда размерное. Данное ничего имеет размерность 1×0, оно так и называется «1×0 empty double row vector». Для удобства пользователя есть отдельная функция empty, позволяющая создать пустоты разного размера, например, double.empty(0, 0, 1, 2) создаёт пустую матрицу 0×0×1×2.
2. «⍴» - это MatLab’овский repmat. Отличие от APL в том, что приходится явно указывать, сколько раз плодить исходную матрицу в каждом из измерений — поскольку просто «пустоты» не бывает.
3. Минимум и максимум, конечно же, пишутся min и max. Небольшое отличие от примера из первой главы APL в том, что они снова ищут минимумы и максимумы вдоль одного из измерений (по умолчанию первого, но, к сожалению, есть нюансы). То есть, min возвращает матрицу той же размерности, что исходная, за исключением размерности, по которой проходил поиск, где размерность будет равняться 1. Т.о. min(0 : 1) вернёт ничего размерности 1×0.
4. Но нельзя же работать без самого большого и самого маленького чисел, для них в MatLab есть специальные литеры: Inf и -Inf. А в добавок ещё и eps — это тоже «самое маленькое число», но в другом смысле: это самое близкое к нулю число, которое ещё отличается от нуля (на моей машине это 2,22e-16).
5. Унитарный вариант «⍴» — это буквальный аналог MatLab’овского size. Хотя нет, аналог не полный — из каких-то своих соображений size никогда не возвращает скаляр. Даже для скаляра он возвращает вектор из двух элементов — действительно, скаляр эквивалентен матрице 1×1. Но он же эквивалентен и матрице 1×1×1×1×1×1. Очевидно, на двух измерениях остановились в силу каких-то исторических причин (в языке полно рудиментов, когда первые два измерения трактуются отлично от следующих).

Конечно, редкая программа на MatLab помещается в одну строчку (у нас кода на 4MB), но это не мешает мне любить свою работу. Но клавиатура как в статье УБЗ мне не помешала бы :-)
Tags: matlab, УБЗ
Subscribe

  • Телефоны-фотоаппараты

    Я продолжаю офигевать от качества фотоаппаратов современных телефонов. Сестра прислала фоточку, а там на фоне видно звёздное небо. Мне стало…

  • Renault Megane Estate PHEV

    Вторая часть, как выразился _not_me, рекламного поста про нашу машинку :-) Потому что водить её оказалось одновременно и удобно,…

  • Стоимость электричества для машины

    У нас с начала мая новая машинка, я  писал, что интересно будет посмотреть на цифры, а тут мы как раз съездили в Италию, данных набралось. Во-первых…

  • Post a new comment

    Error

    default userpic

    Your reply will be screened

    Your IP address will be recorded 

    When you submit the form an invisible reCAPTCHA check will be performed.
    You must follow the Privacy Policy and Google Terms of use.
  • 20 comments

  • Телефоны-фотоаппараты

    Я продолжаю офигевать от качества фотоаппаратов современных телефонов. Сестра прислала фоточку, а там на фоне видно звёздное небо. Мне стало…

  • Renault Megane Estate PHEV

    Вторая часть, как выразился _not_me, рекламного поста про нашу машинку :-) Потому что водить её оказалось одновременно и удобно,…

  • Стоимость электричества для машины

    У нас с начала мая новая машинка, я  писал, что интересно будет посмотреть на цифры, а тут мы как раз съездили в Италию, данных набралось. Во-первых…