【问题标题】:What does [{n,{}}] do in lua?[{n,{}}] 在 lua 中做了什么?
【发布时间】:2019-02-19 18:31:20
【问题描述】:

如你所知,我是 lua 的初学者。我试图理解一个我被困在以下代码段的功能?

在最后一行的下面代码sn-p中使用:

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

对此的任何帮助将不胜感激。谢谢!

【问题讨论】:

  • 很有可能代码中有某些内容您没有向我们展示,或者此代码已损坏但恰好可以正常运行。因为除非fea_imgx 上有某种元表,否则这些表达式中的任何一个都不会导致nil 以外的任何结果。
  • @NicolBolas 我刚刚粘贴了包含我试图理解的特定段的代码部分。这是因为我对 lua 语法不熟悉,只是想知道 [{n,{}}] 是什么。我在这段代码(第 169 行)中遇到了它:link
  • 它在Lua中确实有意义,但只对__index方法有用,[torch]中的具体实现会让理解更完整。

标签: lua lua-table torch


【解决方案1】:

在 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 在 cmets 中所说:索引必须是完全匹配的。这意味着它实际上必须是同一张表,而您提供的代码并非如此。要么您删除了您认为不必要的代码,要么fea_img 上有某种元表。

如果是

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

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

【讨论】:

  • 虽然您所说的肯定是正确的,但这并不能真正解释它应该如何实际工作。表可以用作键,但是当它们被用作键时,唯一能匹配这样键的项目是完全相同的表,而不是包含相同内容的表。由于有问题的表是在原位创建的,它不可能匹配任何现有的键。因此,value2始终nil
  • @Mischa 感谢您的回复。它有助于消除我的疑问,但我不确定索引将如何为 value2 工作。假设如果 k=2 在这种情况下,那么 value1[{k,{}}] 会给我从位置 2 到表 value1 末尾的所有元素吗?
  • @SidharthM 不,如果我们假设 k=2 那么该行将等效于 value1[{2, {}}] 这将在 {2, {}} 的位置获得元素,这将是一个用作索引的表...(整个表是索引)。但正如 Nicol 指出的那样,这将始终返回 nil '因为在 local tab1 = {2, {}}; local tab2 = {2, {}} 的情况下 tab1tab2 不同所以如果 tab1 将用作索引,则无法检索以tab2 为索引的值。
【解决方案2】:

从语法上讲,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-04-19
    • 2016-10-17
    • 2014-09-22
    • 2019-06-10
    • 2015-02-25
    • 2020-12-06
    • 2016-04-10
    • 2014-08-03
    • 2012-02-12
    相关资源
    最近更新 更多