Лучшее преобразование между LuaJIT ffi cdata и torch Tensor

Как лучше всего выполнить преобразование между LuaJIT ffi cdata [1] и Torch Tensor [2].

Согласно ответу Майка в списке рассылки lua-user [3], если мы действительно хотим преобразовать cdata в простую таблицу lua, мы должны сделать цикл для копирования каждого элемента в новый созданный. И на самом деле Torch Tensor предоставляет некоторый интерфейс для лучшего доступа к LuaJIT ffi [4]. Итак, мое текущее решение - сначала выполнить цикл и преобразовать cdata в простую таблицу lua, а затем вызвать функцию построения тензора, которая создает тензор из таблицы [5].

Но на самом деле в моем случае мне нужно очень часто делать подобное преобразование между LuaJIT ffi cdata и Torch Tensor, есть ли лучший подход, а не копирование цикла?


person Xuan Hu    schedule 22.05.2016    source источник


Ответы (1)


Если ваш cdata представляет собой непрерывный массив данных, вы можете использовать ffi.copy. Вот игрушечный пример:

require 'torch'
ffi = require 'ffi'

-- create a random float array
n = 3
x = torch.rand(n):float()
cdata = x:data()
assert(type(cdata) == 'cdata')

-- copy this cdata into a destination tensor
y = torch.FloatTensor(n)
ffi.copy(y:data(), cdata, n*ffi.sizeof('float'))

assert(x:equal(y))
person deltheil    schedule 22.05.2016