你可以告诉我,我是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},{} }]
任何有关这方面的帮助将非常感激。谢谢!
在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_img
有一些某种形式的代码。
如果是
local k = 2
local table1 = {k, { } }
local table2 = {k, { } }
table2
和table1
确实具有完全相同的内容。但他们不是同一张桌子。如果一个用于在表中存储数据而另一个用于将其恢复,那将导致nil
始终被检索。
从语法上讲,t[k]
使用键索引表。通常,如果表中有一个带有密钥k
的记录,则返回其值。没有更多,没有更少。
如果fea_img[i]
是一个普通表,{k,{}}
将总是返回nil
,因为表索引是根据它们的身份解决的({k,{}}
总是一个新表)。根据你的代码,我必须得出结论,fea_img
的元素(即extract_img
返回的内容)不是普通表。
在Lua中,您可以使用metatable覆盖索引操作。如果使用__index
索引具有metatable的值,则在表中没有匹配记录时将使用它:
local t = {}
setmetatable(t, {
__index = function(t, k)
return k
end
})
print(t[{}])
该表具有与之关联的元表,用于索引操作。在这种情况下,__index
返回密钥,但是您使用的任何库都可能提供更复杂的行为。
这是特定于您正在使用的库,而不是与Lua语法相关的内容。