【问题标题】:Torch: CmdLine() : passing array of elements to a variable from command lineTorch:CmdLine():从命令行将元素数组传递给变量
【发布时间】:2017-01-05 05:14:10
【问题描述】:

我正在使用 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 字符串索引,我必须重写 __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)

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

提前致谢。

【问题讨论】:

标签: lua command-line-arguments torch


【解决方案1】:

您可以将列表作为由空格分隔的单词序列传递,并且在 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

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

【讨论】:

  • 您的第二个 sn-p 是一个不错的解决方案。我会用它。谢谢
猜你喜欢
  • 2013-12-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-10
  • 2019-02-16
  • 2017-12-15
  • 2012-06-24
  • 1970-01-01
相关资源
最近更新 更多