使用Torch进行命令行编程:从命令行传递元素数组到变量中

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

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

--解析字符串以提取数字数组
for i=1,string.len(params.cuda_device) do
    if params.cuda_device[i] ~= ' ' then
       -- some code here
    end
end

由于默认情况下不提供Lua字符串索引,因此我不得不覆盖__index以启用字符串索引,如下所示:

getmetatable('').__index = function(str,i) return string.sub(str,i,i) end

这适用于解析字符串为数字数组。

但是,覆盖__index会在其他地方中断代码,并抛出以下错误:

qlua: /home/torch/install/share/lua/5.1/torch/init.lua:173: bad argument #2 to '__index' (number expected, got string)

我可以通过一些解决方法来解决这个问题(而不是直接覆盖__index,则直接使用string.sub(str,i,i)),但我想知道使用torch.CmdLine()传递元素数组的优雅方式。--如果适用的话。

提前致谢。

点赞
用户7066323
用户7066323

你可以像之前一样通过用空格分隔的单词序列来传递列表,在 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

然而,你尝试使用另一个字符串来索引一个字符串是很奇怪的……

2017-01-04 20:53:49