n维阵列lua函数的推广
以下MWE初始化、递增和打印二维和三维数字数组。它可以很容易地扩展到处理4-D etc数组,但更优雅的做法是使用通用函数,将维数(最多7个)作为参数,或者根据输入参数的数量确定维数。实现这一点的好方法是什么 MWE:n维阵列lua函数的推广,lua,Lua,以下MWE初始化、递增和打印二维和三维数字数组。它可以很容易地扩展到处理4-D etc数组,但更优雅的做法是使用通用函数,将维数(最多7个)作为参数,或者根据输入参数的数量确定维数。实现这一点的好方法是什么 MWE: 本地i_低,i_高=2,4 本地i_范围=i_高-i_低-1 局部j_低,j_高=3,7 局部j_范围=j_高-j_低-1 局部k_低,k_高=1,3 本地k_范围=k_高-k_低-1 局部myArray_two={} 局部myArray_three={} 函数initArray_
本地i_低,i_高=2,4
本地i_范围=i_高-i_低-1
局部j_低,j_高=3,7
局部j_范围=j_高-j_低-1
局部k_低,k_高=1,3
本地k_范围=k_高-k_低-1
局部myArray_two={}
局部myArray_three={}
函数initArray_two(t,i_low,i_high,j_low,j_high,value)
局部i,j=0,0
对于i=i_低,i_高,1做
对于j=j_低,j_高,1 do
本地idx=j*i_范围+i
t[idx]=值
结束
结束
结束
函数initArray_three(t,i_low,i_high,j_low,j_high,k_low,k_high,value)
局部i,j,k=0,0,0
对于i=i_低,i_高,1做
对于j=j_低,j_高,1 do
对于k=k_低,k_高,1 do
本地idx=k*j_范围*i_范围+j*i_范围+i
t[idx]=值
结束
结束
结束
结束
右值函数(t,i,j,value)
assert(i>=i_low和i=j_low和j=i_low和i=j_low和j=k_low和k您可以使用函数定义中的…
来概括函数。这将捕获重复参数,理想情况下是范围
function initArray(t, default_value, range, ...)
local args = {...} -- our next ranges
if args[1] then -- if we have more ranges recurse
for i = range[1], range[2], 1 do
t[i] = initArray({}, default_value, table.unpack(args))
end
else -- if we dont have more ranges set default values
for i = range[1], range[2], 1 do
t[i] = default_value
end
end
return t
end
我还更改您的调用以创建高量程和低量程值对
initArray(myArray_two, 0, {i_low, i_high}, {j_low, j_high})
以下是全部代码:
local i_low, i_high = 2, 4
local j_low, j_high = 3, 7
local k_low, k_high = 1, 3
local myArray_two = {}
local myArray_three = {}
function initArray(t, default_value, range, ...)
local args = {...}
if args[1] then
for i = range[1], range[2], 1 do
t[i] = initArray({}, default_value, table.unpack(args))
end
else
for i = range[1], range[2], 1 do
t[i] = default_value
end
end
return t
end
function incrValue(t, value, ...)
local args = {...}
assert(#args >= 1)
local el = t
for _,v in ipairs(args) do
if type(el[v]) == 'table' then
el = el[v]
else
el[v] = el[v] + value
end
end
end
function printArray(t, title)
print(title .. "\n")
for k, v in pairs(t) do
if type(v) == 'table' then
recurPrintArray(k , v)
else
print(k .. "\t" .. v)
end
print("\n")
end
end
function recurPrintArray(s, t)
for k, v in pairs(t) do
if type(v) == 'table' then
recurPrintArray(s .. "\t" .. k, v)
else
print(s .. "\t" .. k .. "\t" .. v)
end
end
end
initArray(myArray_two, 0, {i_low, i_high}, {j_low, j_high})
initArray(myArray_three, 1, {i_low, i_high}, {j_low, j_high}, {k_low, k_high})
incrValue(myArray_two, 11, 2, 3)
incrValue(myArray_two, 13, 2, 3)
incrValue(myArray_two, 5, 4, 7)
printArray(myArray_two, "A 2-D Array", i_low, i_high, j_low, j_high)
incrValue(myArray_three, 9, 2, 3, 1)
incrValue(myArray_three, 17, 2, 3, 1)
printArray(myArray_three, "A 3-D Array", i_low, i_high, j_low, j_high, k_low, k_high)
您可以在函数定义中使用…
对函数进行泛化。这将捕获重复的参数,最好是范围
function initArray(t, default_value, range, ...)
local args = {...} -- our next ranges
if args[1] then -- if we have more ranges recurse
for i = range[1], range[2], 1 do
t[i] = initArray({}, default_value, table.unpack(args))
end
else -- if we dont have more ranges set default values
for i = range[1], range[2], 1 do
t[i] = default_value
end
end
return t
end
我还更改您的调用以创建高量程和低量程值对
initArray(myArray_two, 0, {i_low, i_high}, {j_low, j_high})
以下是全部代码:
local i_low, i_high = 2, 4
local j_low, j_high = 3, 7
local k_low, k_high = 1, 3
local myArray_two = {}
local myArray_three = {}
function initArray(t, default_value, range, ...)
local args = {...}
if args[1] then
for i = range[1], range[2], 1 do
t[i] = initArray({}, default_value, table.unpack(args))
end
else
for i = range[1], range[2], 1 do
t[i] = default_value
end
end
return t
end
function incrValue(t, value, ...)
local args = {...}
assert(#args >= 1)
local el = t
for _,v in ipairs(args) do
if type(el[v]) == 'table' then
el = el[v]
else
el[v] = el[v] + value
end
end
end
function printArray(t, title)
print(title .. "\n")
for k, v in pairs(t) do
if type(v) == 'table' then
recurPrintArray(k , v)
else
print(k .. "\t" .. v)
end
print("\n")
end
end
function recurPrintArray(s, t)
for k, v in pairs(t) do
if type(v) == 'table' then
recurPrintArray(s .. "\t" .. k, v)
else
print(s .. "\t" .. k .. "\t" .. v)
end
end
end
initArray(myArray_two, 0, {i_low, i_high}, {j_low, j_high})
initArray(myArray_three, 1, {i_low, i_high}, {j_low, j_high}, {k_low, k_high})
incrValue(myArray_two, 11, 2, 3)
incrValue(myArray_two, 13, 2, 3)
incrValue(myArray_two, 5, 4, 7)
printArray(myArray_two, "A 2-D Array", i_low, i_high, j_low, j_high)
incrValue(myArray_three, 9, 2, 3, 1)
incrValue(myArray_three, 17, 2, 3, 1)
printArray(myArray_three, "A 3-D Array", i_low, i_high, j_low, j_high, k_low, k_high)
数组是否必须展平,或者是否允许使用嵌套数组?谢谢@luther。我对展平数组或嵌套数组都很满意。一般来说,我觉得展平数组更容易使用,但如果实现隐藏了细节,那就没有什么区别了。您可以递归地实现广义函数。@DLyons:您的函数没有得到所有的结果它使用像i_range
这样的东西,这些东西是在函数之外声明的,可能不会反映实际传递给它的参数的值。这是故意的吗?@Egor Skriptunoff理论上我知道,但如果你能勾勒出一个例子,这会让我省去很多浮躁:-)数组是否必须展平,或者是否允许使用嵌套数组?谢谢@luther。我喜欢扁平数组或嵌套数组。一般来说,我觉得扁平化更容易处理,但如果实现隐藏了细节,则不会有任何区别。您可以递归地实现广义函数。@DLyons:您的函数不会从其参数中获取所有值。它使用诸如i_range
之类的内容,这些内容在函数外部声明,可能不会反映实际传递给它的参数值。这是故意的吗?@Egor Skriptunoff理论上我知道,但如果你能举出一个例子的话,我就不用再浮躁了:-)谢谢。又好又简单。仅供参考,有一个输入错误“k_high”应该是“k_high”,@DLyons woops看起来像是我在之前的编辑中粘贴代码时漏掉了args。代码应该在k_high)
处结束,它只是再次重复args,并不是说它有任何危害——实际上没有危害。再次感谢,谢谢。又好又简单。仅供参考,有一个输入错误“k_high”应该是“k_high”,@DLyons woops看起来像是我在之前的编辑中粘贴代码时漏掉了args。代码应该在k_high)
处结束,它只是再次重复args,并不是说它有任何危害——实际上没有危害。再次感谢。