Сканирующие операции на каждой паре векторных элементов
У меня есть следующий вектор:
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 использует как минимум три разных целочисленных значения ширины, скорость может быть разной для каждого из них. Эксперимент.