Копирование фрагмента OCaml Bigarray.Array1 в байты - PullRequest
0 голосов
/ 11 декабря 2018

У меня есть OCaml Bigarray.Array1, созданный из файла с элементами char и макетом C.Я пытаюсь извлечь его кусочки до Bytes.t.Например, получить содержимое массива от символа 3 до символа 10 в переменную byte длины 7.

Есть ли лучший способ, чем зацикливание индекса и использование Bytes.set?

Например,

(* this feels inefficient *)
let slice array a b =
   let bytes = Bytes.create (b - a) in    
   for i = a to b-1 do
      Bytes.set bytes i (Bigarray.Array1.get array i)
   done ; bytes

Я знаю Bigarray.Array1.sub, но на самом деле это не приближает меня.Проблема в том, что операции являются полиморфными в типе массива ... есть ли специализированные, эффективные операции для массивов символов?

1 Ответ

0 голосов
/ 11 декабря 2018

Если вам нужен Bytes.t, вы все равно должны скопировать значения, я думаю.Вероятно, наиболее оптимальным является следующее:

let slice array a b =
  let sub = Bigarray.Array1.sub array a (b-a) in
  Bytes.init  (b - a)  (fun i -> Bigarray.Array1.unsafe_get sub i)

Bytes.init использует unsafe_set, а Bigarray.Array1.unsafe_get - самый быстрый способ считывания данных (и проверка границ уже выполняется с помощью sub).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...