PDL Threading - это концепция, которую вы ищете здесь. Общий метод зацикливания вдоль измерений состоит в добавлении фиктивных измерений в соответствующих местах, чтобы при вычислении генерировались неявные необходимые петли потоков. Для многомерной задачи может быть несколько разных способов добавить dim и, следовательно, создать петли потока.
Для расчета парных строк вы можете выбрать два вложенных цикла по индексам срезов, которые имеют циклы perl по двум индексам и будут генерировать потоки PDL вдоль строк. Вы можете использовать только один цикл perl над индексами, но воспользоваться неявным зацикливанием потоков для вычисления всех строк одновременно.
Полностью вычисление PDL-threadloop должно было бы добавить фиктивное измерение для цикла по строкам для каждого из аргументов, чтобы можно было рассчитать все N ** 2 вычисления строки одновременно. Вот пример массива shape [4,3] с вычислением, являющимся оператором ==:
pdl> $b = floor(random(4,3)*5)
pdl> p $b
[
[0 4 3 3]
[3 3 4 2]
[4 0 1 4]
]
pdl> p $b(,*3)==$b(,,*3)
[
[
[1 1 1 1]
[0 0 0 0]
[0 0 0 0]
]
[
[0 0 0 0]
[1 1 1 1]
[0 0 0 0]
]
[
[0 0 0 0]
[0 0 0 0]
[1 1 1 1]
]
]
Результатом является форма [4,3,3] piddle с 0-м измерением, соответствующим строкам, полученным в результате парного вычисления, а 1-е и 2-е значения соответствуют индексам строк, участвующим в операции ==.
Если вам нужно значение индекса из или для одного из этих вычислений петли потока, используйте xvals , yvals , zvals или axisvals для генерации piddle со значениями индекса, соответствующими оси этого массива.
pdl> p $b->xvals
[
[0 1 2 3]
[0 1 2 3]
[0 1 2 3]
]
pdl> p $b->yvals
[
[0 0 0 0]
[1 1 1 1]
[2 2 2 2]
]
Существует множество деталей, касающихся реализации потоков PDL (не совпадающих с потоками perl или posix). Я рекомендую список рассылки perldl для ознакомления и обсуждения с другими пользователями и разработчиками PDL. Также см. Первый черновой вариант Книги PDL , в котором более подробно описываются вычисления и многопоточность PDL.