Сканирующие операции на каждой паре векторных элементов

У меня есть следующий вектор:

t ← 1 2 2 3 4 5 5 5 6 6

и хотел бы сложить каждую пару (аналогично 2+/vec, который суммирует каждые 2 смежных элемента).

Какой самый эффективный способ сделать это в APL?

2 ответа

Решение

Если я понимаю ваш вопрос, вы пытаетесь суммировать каждые два пункта. Самый простой способ сделать это - преобразовать в матрицу и затем суммировать по строкам:

    t←1 2 2 3 4 5 5 5 6 6
       5 2⍴t
1 2
2 3
4 5
5 5
6 6
       +/5 2⍴t
3 5 9 10 12

Это легко обобщает для триплетов и т. Д. Очевидно, что вы можете написать небольшую функцию для определения формы полученной матрицы.

Предполагая, что вы хотите перекрывающихся пар, попробуйте

2 +/ 1 drop (-1) drop 2 / x    // sorry, no apl characters

Время будет зависеть от реализации APL, а также от типа данных и ширины целого числа. Большинство APL поддерживают как минимум 2 типа чисел, 2 или 4-байтовые целые числа, 8-байтовые числа с плавающей запятой, не говоря уже о логических значениях. Dyalog APL использует как минимум три разных целочисленных значения ширины, скорость может быть разной для каждого из них. Эксперимент.

Другие вопросы по тегам