Lua Torch:CmdLine():从命令行将元素数组传递给变量

Lua Torch:CmdLine():从命令行将元素数组传递给变量,lua,command-line-arguments,torch,Lua,Command Line Arguments,Torch,我正在使用torch.CmdLine()解析torch中的命令行参数。我需要为其中一个变量传递一个元素数组。我不知道为变量传递元素数组的任何机制。因此,我将该变量视为一个字符串,并从命令行传递由空格分隔并包含在双引号内的元素数组。 执行此操作的代码如下所示: cmd = torch.CmdLine() cmd:text('Training') cmd:text() cmd:option('-cuda_device',"1 2 3") params = cmd:parse(arg or {})

我正在使用torch.CmdLine()解析torch中的命令行参数。我需要为其中一个变量传递一个元素数组。我不知道为变量传递元素数组的任何机制。因此,我将该变量视为一个字符串,并从命令行传递由空格分隔并包含在双引号内的元素数组。 执行此操作的代码如下所示:

cmd = torch.CmdLine()
cmd:text('Training')
cmd:text()
cmd:option('-cuda_device',"1 2 3")
params = cmd:parse(arg or {})

--parse the string to extract array of numbers
for i=1,string.len(params.cuda_device) do
    if params.cuda_device[i] ~= ' ' then
       -- some code here
    end
end
这里,由于默认情况下不提供Lua字符串索引,因此我必须重写_索引以启用字符串索引,如下所示:

getmetatable('').__index = function(str,i) return string.sub(str,i,i) end
这适用于将字符串解析为数字数组

但是,重写_索引会在其他地方中断代码,引发以下错误:

qlua: /home/torch/install/share/lua/5.1/torch/init.lua:173: bad argument #2 to '__index' (number expected, got string)
我可以做一些变通方法来解决这个问题(而不是直接重写_index use string.sub(str,I,I))但是我想知道您对使用torch.CmdLine()以优雅的方式传递元素数组的建议——如果适用的话


提前感谢。

您可以像以前一样,以空格分隔的单词序列传递列表,在cmd:parse之后,您可以使用以下命令将字符串分解为数组:

params = cmd:parse()
local tmptab = {}
for word in params.cuda_device:gmatch("%w+") do
  tmptab[#tmptab +1] = word
end
params.cuda_device = tmptab
for i,v in pairs(params.cuda_device) do
   -- some code here
end
这将把cmd:parse()解析的字符串分解成一个表,表中的每个单词都在索引中,不需要深入研究字符串元方法

此外,您还可以通过以下操作避免错误:

getmetatable('').__index = function(str,i)
  if(type(i) == "number") then
    return string.sub(str,i,i)
  else
    return ""
  end 
end

奇怪的是,您尝试使用另一个字符串为一个字符串编制索引,但是…

您可以像以前一样将列表作为一个由空格分隔的单词序列传递,并且在cmd:parse之后,您可以使用以下命令将该字符串分解为一个数组:

params = cmd:parse()
local tmptab = {}
for word in params.cuda_device:gmatch("%w+") do
  tmptab[#tmptab +1] = word
end
params.cuda_device = tmptab
for i,v in pairs(params.cuda_device) do
   -- some code here
end
这将把cmd:parse()解析的字符串分解成一个表,表中的每个单词都在索引中,不需要深入研究字符串元方法

此外,您还可以通过以下操作避免错误:

getmetatable('').__index = function(str,i)
  if(type(i) == "number") then
    return string.sub(str,i,i)
  else
    return ""
  end 
end

奇怪的是,您尝试使用另一个字符串索引一个字符串,但是…

嘿!检查文档:然后回答这个问题。希望有帮助@ManuelLagunas我也在做类似的事情。但是我想知道是否可以用字符串以外的其他格式传递元素数组。谢谢你的建议。嘿!检查文档:然后回答这个问题。希望有帮助@ManuelLagunas我也在做类似的事情。但是我想知道是否可以用字符串以外的其他格式传递元素数组。谢谢你的建议。你的第二个片段是一个很好的解决方案。我会用的。感谢您的第二个代码片段是一个很好的解决方案。我会用的。谢谢