Lua [{n,{}}]在卢阿做什么?

Lua [{n,{}}]在卢阿做什么?,lua,lua-table,torch,Lua,Lua Table,Torch,你可以看出我是lua的初学者。我正在试图理解一个函数,我被困在下面的代码段做什么 它用于最后一行的以下代码段中: function classify(txt_dir, img_dir, cls_list) local acc = 0.0 local total = 0.0 local fea_img = {} local fea_txt = {} for fname in io.lines(cls_list) do local imgpat

你可以看出我是lua的初学者。我正在试图理解一个函数,我被困在下面的代码段做什么

它用于最后一行的以下代码段中:

function classify(txt_dir, img_dir, cls_list)
    local acc = 0.0
    local total = 0.0
    local fea_img = {}
    local fea_txt = {}
    for fname in io.lines(cls_list) do
        local imgpath = img_dir .. '/' .. fname .. '.t7'
        local txtpath = txt_dir .. '/' .. fname .. '.t7'
        fea_img[#fea_img + 1] = extract_img(imgpath) 
        fea_txt[#fea_txt + 1] = extract_txt(txtpath)
    end
    for i = 1,#fea_img do
        -- loop over individual images.
        for k = 1,fea_img[i]:size(1) do
            local best_match = 1
            local best_score = -math.huge
            for j = 1,#fea_txt do
                local cur_score = torch.dot(fea_img[i][{k,{}}], fea_txt[j])
  for i = 1,nsamples,batchsize do
     -- indices
     local lasti = math.min(i+batchsize-1,nsamples)
     local m = lasti - i + 1

     -- k-means step, on minibatch
     local batch = x[{ {i,lasti},{} }]
据我所知,fea_img是一个lua表。行fea_img[i][{k,{}}]是表fea_img中键“i”的值的某种切片吗

我尝试搜索更多示例,发现此处也使用了此示例(最后一行):


在此方面的任何帮助都将不胜感激。谢谢大家!

在lua中,您可以通过多种方式访问表上的特定索引。比如这两个例子

local myValue = someTable.theIndex
-- or
local myOtherValue = someTable[2]
因此,您在这里看到的构造是从(嵌套)表中访问一些值。
此外,在lua中,您可以使用除
nil
之外的任何内容作为索引,因此甚至可以使用表

线路

fea_img[i][{k,{}}]
可以扩展到:

local index1 = i -- i in this case is your loop variable
local index2 = { k , { } } -- This creates a table with 2 values, the first one will be the vaule of the var k, the second one is an empty table

local value1 = fea_img[index1] -- This will get you a table
local value2 = value1[index2] -- This will get the same as: fea_img[i][{k,{}}]
更正和添加:

正如Nicol Bolas在评论中所说:索引必须是精确匹配的。这意味着它必须是同一个表,而您提供的代码不是这样。要么您丢弃了您认为不必要的代码,要么
fea\u img
上有某种元表

local k = 2
local table1 = {k, { } }
local table2 = {k, { } }

table2
table1
的内容完全相同。但它们不是同一张桌子。这将导致
nil
总是被检索,如果一个用于在表中存储数据,另一个用于取回数据。

从语法上讲,
t[k]
是用键索引表。通常,如果表中有一条记录的键为
k
,则返回其值。不多不少

如果
fea_img[i]
是一个普通表,
{k,{}}
将始终返回
nil
,因为表索引是基于它们的标识解析的(
{k,{}}
始终是一个新表)。根据您的代码,我必须得出结论,
fea\u img
(即
extract\u img
返回的内容)的元素不是正常表

在Lua中,可以使用元表覆盖索引操作。如果对具有元表且索引为
\u\u index
的值进行索引,则在表中没有匹配记录时将使用该值:

local t = {}
setmetatable(t, {
    __index = function(t, k)
        return k
    end
})
print(t[{}])
此表有一个关联的元表,用于索引操作。在本例中,
\uu index
返回键,但您使用的任何库都可能提供更复杂的行为


这是特定于您正在使用的库的,而不是与Lua语法相关的内容。

虽然您所说的肯定是正确的,但这并不能真正解释它应该如何实际工作。表可以用作键,但当它们用作键时,唯一与键匹配的项是完全相同的表,而不是包含相同内容的表。由于正在讨论的表是在现场创建的,因此它不可能与任何现有键匹配。因此,
value2
将始终为
nil
@misha感谢您的回复。这有助于澄清我的疑问,但我不确定索引将如何为value2工作。假设在这种情况下,如果
k=2
,那么
value1[{k,{}]
会给我从位置2到表value1末尾的所有元素吗?@SidharthM否,如果我们计算
k=2
,那么该行将相当于
value1[{2,{}]
,它将得到位于
{2,{}位置的元素
wich将是一个用作索引的表。。。(整张表是索引)。但是正如Nicol指出的,这将始终返回
nil
,因为在
local tab1={2,{}的情况下;本地tab2={2,{}
tab1
tab2
不同,因此如果
tab1
将被用作索引,您就不能用
tab2
作为索引来检索值。很可能代码中有一些东西没有显示给我们,或者该代码被破坏了,但恰好运行正常。因为除非
fea_img
x
上有某种元表,否则这些表达式中的任何一个都不会产生除
nil
@nicobolas之外的任何结果。我刚刚粘贴了包含我试图理解的特定段的代码部分。这是因为我不熟悉lua的语法,只是想知道什么[{n,{}}]。我在这段代码(第169行)中发现了它:它在Lua中确实有意义,但只在
\uu index
方法中有用,[]中的具体实现将使理解更加完整。