2017-01-04 5 views
1

Я использую torch.CmdLine() для анализа аргументов командной строки в Torch. Мне нужно передать массив элементов для одной из переменных. Я не знаю никаких механизмов передачи массива элементов для переменной. Поэтому я рассматриваю эту переменную как строку и передаю массив элементов, разделенных пробелом, и заключен в двойные кавычки из командной строки. Код для этого выглядит следующим образомTorch: CmdLine(): передача массива элементов в переменную из командной строки

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) 

я могу сделать некоторые обходные пути, чтобы исправить это (а не перекрывая использование __index string.sub (ул, я, я) напрямую), но я хотел бы знать ваши предложения по передаче массива элементов с использованием torch.CmdLine() элегантным способом - если применимо.

Спасибо заранее.

+0

Эй! проверьте документы: https://github.com/torch/torch7/blob/master/doc/cmdline.md#table-parsearg и этот ответ http://stackoverflow.com/questions/32379841/lua-cmd-line- строка. Надеюсь, поможет! –

+0

@ManuelLagunas Я делаю что-то очень похожее. Но мне было интересно, могу ли я передать массив элементов в другом формате, отличном от строки. Спасибо за ваше предложение. – Arul

ответ

0

Вы можете передать список как последовательность слов, разделенных пробелами, как вы сделали, и после того, как ЦМД: разобрать можно взорвать строку в массив с помощью:

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 

Это взорвет строку разобран УМК: разбор() в таблицу с каждым словом на это по индексу, и не было бы никакой необходимости углубляться в строковых метаметоды ...

Кроме того, вы можете избежать ошибки делать это:

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

Странно, что вы попытались индексировать строку, используя другую строку, однако ...

+1

Ваш второй фрагмент - прекрасное решение. Я буду использовать его. благодаря – Arul

 Смежные вопросы

  • Нет связанных вопросов^_^