Используется ли функция слайса Haskell Repa, аналогичная Vector и другим языкам? - PullRequest
0 голосов
/ 26 ноября 2018

Я пытаюсь получить пригодную для использования версию многомерных массивов в Haskell, сопоставимую с массивами numpy в Python и других языках.Я нашел другие вопросы о том, как написать пользовательские функции для массивов определенных измерений, но моя цель - более точно, получить аналогичное поведение функции Data.Vector slice, которая интуитивно понятна и выполняет работу с скобками.индексированные массивы других языков.

Vector Функция slice имеет тип V.slice :: Int -> Int -> V.Vector a -> V.Vector a

, поэтому вырезать вектор v так же просто, как

import Data.Vector as V
let v = V.fromList [1..10]
    i = 1
    j = 5
V.slice i j v

Repa 's slice, с другой стороны, имеет тип

R.slice :: (R.Slice sl, R.Shape (R.FullShape sl), R.Source r e) => R.Array r (R.FullShape sl) e -> sl -> R.Array R.D (R.SliceShape sl) e

, поэтому он принимает массив Repa и фигуру и возвращает задержанный массив.Я понимаю, что Repa не принимает целые числа в качестве индексов, но я ищу общее использование функции slice для произвольного измерения, независимо от того, используется ли Repa '(Z :. i) или ixn спецификация измерения.

Я не ищу зависящую от измерения функцию, использующую traverse, и предпочел бы не заходить ни в какой шаблон haskell, чтобы обобщить это, хотя, если невозможно использовать функцию slice, как правило, это то, что есть.

Тогда возникает вопрос: можно ли использовать функцию Repa *1032* для получения произвольных фрагментов многомерных массивов, как в numpy 'sv [x1: x2, y1: y2?] или C ++ Eigen s matrix.block<p,q>(i,j)?

1 Ответ

0 голосов
/ 26 ноября 2018

Я считаю, что ближайший эквивалент extract , который принимает начальный индекс (например, ix2 x1 y1) и размер (например, ix2 (x2-x1) (y2-y1)).

Результат extractвсегда имеет то же количество измерений, что и входные данные, но может иметь разные размеры в каждом измерении.Результат slice может иметь различное количество измерений, но в любом данном измерении он принимает либо все элементы, либо ровно один.(На основании примеров для Shape и Slice.)

...