LuaJIT ffi cdata 和 torch Tensor 之间的最佳转换

Best conversion between LuaJIT ffi cdata and torch Tensor

在 LuaJIT ffi cdata [1] 和 Torch Tensor [2] 之间执行转换的最佳方法是什么。

根据 Mike 在 lua-user mail list [3] 中的回复,如果我们真的想将 cdata 转换为 lua plain table,我们必须执行一个循环以将每个项目复制到新创建的项目。实际上 Torch Tensor 确实为更好的 LuaJIT ffi 访问提供了一些接口 [4]。因此,我目前的解决方案是先进行循环并将 cdata 转换为 lua 普通 table,然后调用从 table [5] 创建张量的张量构造函数。

但实际上在我的情况下,我需要非常频繁地在 LuaJIT ffi cdata 和 Torch Tensor 之间进行类似的转换,有没有比循环复制更好的方法?

如果您的 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))