创建一个可变长度的二维列表[torch]

时间:2016-08-08 19:36:11

标签: arrays lua torch

我想创建一个可以在其中包含可变长度元素的2D列表,例如,如果我在MATLAB中有一个10x10列表,我可以 用以下内容定义:

z = cell(10,10)

并通过这样做开始分配一些元素:

z{2}{3} = ones(3,1)
z{1}{1} = zeros(100,1)
z{1}{2} = []
z{1}{3} = randn(20,1)
...

在火炬中定义这种空2D列表的最佳方法是什么?此外,有没有办法利用张量结构来做到这一点?

在python中,我可以做一些事情来定义一个空的10x10 2D列表:

z = [[None for j in range(10)] for i in range(10)]

我对火炬的最佳猜测是做

之类的事情
z = torch.Tensor(10,10)

for i=1,10 do
  for j=1,10 do
    z[{{i},{j}}] = torch.Tensor()
  end
end

但是,这不起作用,并且在张量内定义张量似乎是一个坏主意......

这是对此处提出的问题的跟进(但是在python中询问的链接中):Create 2D lists in python with variable length indexed vectors

2 个答案:

答案 0 :(得分:1)

从我读过的文档中,张量只支持原始数值数据类型。您将无法使用张量作为预期用途。利用表格。

local function makeMatrix(initialVal, ...)
    local isfunc = type(initialVal) == "function"
    local dimtable = {...}
    local function helper(depth)
        if depth == 0 then
            return isfunc and initialVal() or initialVal
        else
            local plane = {}
            for i = 1, dimtable[depth] do
                plane[i] = helper(depth-1)
            end
            return plane
        end
    end
    return helper(#dimtable)
end

p = makeMatrix(0, 2, 3, 5) -- makes 3D matrix of size 2x3x5 with all elements initialized to 0

makeMatrix(torch.Tensor, m ,n)

答案 1 :(得分:0)

来自Torch的Google网上论坛的回答。同意表是解决方案:

z = {}

for i=1,10 do

  z[i] = {}
  for j=1,10 do
    z[i][j] = torch.Tensor()
  end
end