首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >[{n,{}}]在lua中做什么?

[{n,{}}]在lua中做什么?
EN

Stack Overflow用户
提问于 2018-09-15 08:10:25
回答 2查看 184关注 0票数 2

如你所知,我是lua的初学者。我试图理解一个函数,我在下面的代码段中遇到了什么?

在下面最后一行的代码片段中使用了它:

代码语言:javascript
复制
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_imgi是否对表fea_img中键'i‘的值进行了某种切片?

我试着搜索更多的例子,发现这里也用到了(最后一行):

代码语言:javascript
复制
  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},{} }]

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

EN

回答 2

Stack Overflow用户

发布于 2018-09-15 08:39:49

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

代码语言:javascript
复制
local myValue = someTable.theIndex
-- or
local myOtherValue = someTable[2]

因此,您在这里看到的构造是访问(嵌套)表中的一些值。

此外,在lua中,您可以使用除nil之外的任何内容作为索引,因此即使是表也是可能的。

这条线

代码语言:javascript
复制
fea_img[i][{k,{}}]

可以扩展到以下内容:

代码语言:javascript
复制
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_img上有某种元表。

在以下情况下

代码语言:javascript
复制
local k = 2
local table1 = {k, { } }
local table2 = {k, { } }

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

票数 3
EN

Stack Overflow用户

发布于 2018-09-15 23:01:12

从语法上讲,t[k]使用键对表进行索引。正常情况下,如果表中存在键为k的记录,则返回其值。没有更多,没有更少。

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

在Lua中,您可以使用元表覆盖索引操作。如果您使用__index对具有元数据表的值进行索引,则在表中没有匹配记录的情况下将使用它:

代码语言:javascript
复制
local t = {}
setmetatable(t, {
    __index = function(t, k)
        return k
    end
})
print(t[{}])

此表有一个与之关联的元表,用于索引操作。在本例中,__index返回密钥,但无论您使用的是什么库,都可能提供更复杂的行为。

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52340524

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档