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 之间进行类似的转换,有没有比循环复制更好的方法?
- [1] http://luajit.org/ext_ffi_api.html(
Creating cdata Objects
部分)
- [2] https://github.com/torch/torch7/blob/master/doc/tensor.md
- [3] http://lua-users.org/lists/lua-l/2011-03/msg00584.html
- [4]https://github.com/torch/torch7/blob/master/doc/tensor.md#luajit-ffi-access
- [5] https://github.com/torch/torch7/blob/master/doc/tensor.md#torchtensortable
如果您的 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))
在 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 之间进行类似的转换,有没有比循环复制更好的方法?
- [1] http://luajit.org/ext_ffi_api.html(
Creating cdata Objects
部分) - [2] https://github.com/torch/torch7/blob/master/doc/tensor.md
- [3] http://lua-users.org/lists/lua-l/2011-03/msg00584.html
- [4]https://github.com/torch/torch7/blob/master/doc/tensor.md#luajit-ffi-access
- [5] https://github.com/torch/torch7/blob/master/doc/tensor.md#torchtensortable
如果您的 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))