Lua:k维点集
Lua: set of k-dimensional points
我想确保我随机生成的 kD 点不会碰巧相同。为了有效地测试它,我想使用一个集合(至少我会在 C++ 中这样做)。
我知道在 Lua 中,表可以通过将对象作为值插入任何非零键(通常只是 true 或整数多组)。
但问题是 Lua 中的表在默认情况下只是比较 w.r.t。他们的地址,即使所有矢量分量(在我的例子中)都相等,这当然是不同的。
所以我想我会为我的观点实施一个 equal and/or less than 元方法。但这没有用(见下面的代码)。有人可以帮忙吗?
local k = 3
local mt = {}
mt.__eq = function( a, b )
for dim = 1, k do
if a[dim] ~= b[dim] then return false end
end
return true
end
mt.__lt = function( a, b )
for dim = 1, k do
if a[dim] < b[dim] then
return true
elseif a[dim] > b[dim] then
return false
end
end
return false -- equal
end
local set = {}
local p1 = { 1, 2, 3 }
setmetatable( p1, mt )
set[p1] = true
local p2 = { 1, 2, 3 }
setmetatable( p2, mt )
set[p2] = true -- should just overwrite the old value
print( "p1 == p2 --> "..tostring( p1 == p2 ) )
print( "p1 < p2 --> "..tostring( p1 < p2 ) )
local setSize = 0
for _, _ in pairs( set ) do
setSize = setSize + 1
end
print( "Size of the set: "..setSize )
Lua 没有允许您尝试做的事情的设施。也就是说,没有元方法可以使两个不同的用户数据或两个不同的 table 映射到 table 索引系统的相同索引。
您必须手动执行此操作。通过保持排序的向量列表,您可以有效地编写自己的集合。 table.sort
可以完成这项工作,因为您已经有了合适的 __lt
元方法。
如果有人感兴趣:我想出了另一个对我有用的 work-around。
可以使用一组 x-coordinates,而不是仅将集合项与 "true" 或“1”相关联,各个值是集合本身(y-coordinates);等等。
这导致了一个 tree-like 结构,其中每个叶子的路径代表一个点(坐标序列)并且具有相同第一个坐标的点具有共同的父节点。而且所有的点都是唯一的。
我想确保我随机生成的 kD 点不会碰巧相同。为了有效地测试它,我想使用一个集合(至少我会在 C++ 中这样做)。
我知道在 Lua 中,表可以通过将对象作为值插入任何非零键(通常只是 true 或整数多组)。 但问题是 Lua 中的表在默认情况下只是比较 w.r.t。他们的地址,即使所有矢量分量(在我的例子中)都相等,这当然是不同的。
所以我想我会为我的观点实施一个 equal and/or less than 元方法。但这没有用(见下面的代码)。有人可以帮忙吗?
local k = 3
local mt = {}
mt.__eq = function( a, b )
for dim = 1, k do
if a[dim] ~= b[dim] then return false end
end
return true
end
mt.__lt = function( a, b )
for dim = 1, k do
if a[dim] < b[dim] then
return true
elseif a[dim] > b[dim] then
return false
end
end
return false -- equal
end
local set = {}
local p1 = { 1, 2, 3 }
setmetatable( p1, mt )
set[p1] = true
local p2 = { 1, 2, 3 }
setmetatable( p2, mt )
set[p2] = true -- should just overwrite the old value
print( "p1 == p2 --> "..tostring( p1 == p2 ) )
print( "p1 < p2 --> "..tostring( p1 < p2 ) )
local setSize = 0
for _, _ in pairs( set ) do
setSize = setSize + 1
end
print( "Size of the set: "..setSize )
Lua 没有允许您尝试做的事情的设施。也就是说,没有元方法可以使两个不同的用户数据或两个不同的 table 映射到 table 索引系统的相同索引。
您必须手动执行此操作。通过保持排序的向量列表,您可以有效地编写自己的集合。 table.sort
可以完成这项工作,因为您已经有了合适的 __lt
元方法。
如果有人感兴趣:我想出了另一个对我有用的 work-around。
可以使用一组 x-coordinates,而不是仅将集合项与 "true" 或“1”相关联,各个值是集合本身(y-coordinates);等等。
这导致了一个 tree-like 结构,其中每个叶子的路径代表一个点(坐标序列)并且具有相同第一个坐标的点具有共同的父节点。而且所有的点都是唯一的。