2015-05-31 63 views
5

我要初始化与torch7的索引相关功能的三维张量,即快速的方法来初始化torch7张量

func = function(i,j,k) --i, j is the index of an element in the tensor 
    return i*j*k  --do operations within func which're dependent of i, j 
end 

然后我初始化一个三维张量是这样的:

for i=1,A:size(1) do 
    for j=1,A:size(2) do 
     for k=1,A:size(3) do 
      A[{i,j,k}] = func(i,j,k) 
     end 
    end 
end 

但是这段代码运行速度很慢,我发现它占总运行时间的92%。在torch7中有没有更有效的方法来初始化3D张量?

+0

什么是大小'A'的? – ryanpattison

回答

7

参见用于Tensor:apply

这些功能的文档应用的函数,在 张量的每个元件,其被调用的方法(自)。这些方法比使用Lua中的for循环的 快得多。

文档中的示例基于其索引i(在内存中)初始化2D数组。以下是三维的扩展示例,低于N维张量的示例。使用应用方法多,更快我的机器上:

require 'torch' 

A = torch.Tensor(100, 100, 1000) 
B = torch.Tensor(100, 100, 1000) 

function func(i,j,k) 
    return i*j*k  
end 

t = os.clock() 
for i=1,A:size(1) do 
    for j=1,A:size(2) do 
     for k=1,A:size(3) do 
      A[{i, j, k}] = i * j * k 
     end 
    end 
end 
print("Original time:", os.difftime(os.clock(), t)) 

t = os.clock() 
function forindices(A, func) 
    local i = 1 
    local j = 1 
    local k = 0 
    local d3 = A:size(3) 
    local d2 = A:size(2) 
    return function() 
    k = k + 1 
    if k > d3 then 
     k = 1 
     j = j + 1 
     if j > d2 then 
     j = 1 
     i = i + 1 
     end 
    end 
    return func(i, j, k) 
    end 
end 

B:apply(forindices(A, func)) 
print("Apply method:", os.difftime(os.clock(), t)) 

编辑

这对于任何张量的目标工作:

function tabulate(A, f) 
    local idx = {} 
    local ndims = A:dim() 
    local dim = A:size() 
    idx[ndims] = 0 
    for i=1, (ndims - 1) do 
    idx[i] = 1 
    end 
    return A:apply(function() 
    for i=ndims, 0, -1 do 
     idx[i] = idx[i] + 1 
     if idx[i] <= dim[i] then 
     break 
     end 
     idx[i] = 1 
    end 
    return f(unpack(idx)) 
    end) 
end 

-- usage for 3D case. 
tabulate(A, function(i, j, k) return i * j * k end) 
+0

@deltheil是的,谢谢。 – ryanpattison

+0

不客气! (评论删除,因为它是没有更多的相关后,这[edit](http://stackoverflow.com/revisions/30560653/5)) – deltheil

+0

伟大的答案!只要仿函数可以正确编译,它就会非常快(接近C速度) – smhx