我想创建一个可以在其中包含可变长度元素的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
答案 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