lua中 [{n,{}}] 表示什么?

从我理解的代码来看,我是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])

据我了解,fea_img是一个lua表格。那么 fea_img[i][{k,{}}] 这行代码是否表示在表格fea_img中查找键为'i'的值的切片?

我尝试搜索更多示例,并在此处找到此处使用的代码(最后一行):

  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},{} }]

如有帮助,将不胜感激。谢谢!

点赞
用户4273199
用户4273199

在Lua中,你可以以多种方式访问表中的特定索引。像这两个例子一样:

local myValue = someTable.theIndex
-- 或者
local myOtherValue = someTable[2]

所以,这里看到的结构是从一个(嵌套)表中访问一些值。

此外,在Lua中,可以使用除nil之外的任何东西作为索引,因此甚至可以使用表。

这行代码:

fea_img[i][{k,{}}]

可以扩展为这个:

local index1 = i -- 这种情况下的i是你的循环变量
local index2 = { k , { } } -- 这将创建一个具有2个值的表,第一个值将是变量k的值,第二个值是一个空表

local value1 = fea_img[index1] -- 这将取得一个表
local value2 = value1[index2] -- 这将得到与fea_img[i][{k,{}}]相同的值

更正和添加:

正如Nicol Bolas在评论中所说的那样:索引必须是精确匹配的。这意味着它必须确切地是相同的表,这在你提供的代码中并不是这样。你可能是省略了你认为不必要的代码,或者fea_img具有某种元表。

在这种情况下:

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

table2table1具有完全相同的内容。但它们不是同一个表。这将导致如果一个用于在表中存储数据,另一个用于检索数据,则始终检索到nil

2018-09-15 00:39:48
用户1424244
用户1424244

从语法上讲,t[k] 使用一个键值索引一个表。通常情况下,如果表中存在键为 k 的记录,则返回其值。不多不少。

如果fea_img[i]是一个普通表,则 {k,{}} 将始终返回 nil,因为表索引是基于它们的标识解析的({k,{}} 总是一个新表)。根据你的代码,我必须得出的结论是 fea_img 的元素(即 extract_img 返回的结果)不是普通表。

在 Lua 中,可以使用元表重载索引操作。如果索引一个具有元表的值,并且在表中没有匹配的记录,则使用元表中的 __index

local t = {}
setmetatable(t, {
    __index = function(t, k)
        return k
    end
})
print(t[{}])

这个表有一个与之关联的元表,用于索引操作。在这种情况下,__index 返回键,但是你使用的任何库都可能提供更复杂的行为。

这是你使用的库特定的,与 Lua 语法无关的东西。

2018-09-15 15:01:12