Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
n维阵列lua函数的推广_Lua - Fatal编程技术网

n维阵列lua函数的推广

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_

以下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_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,并不是说它有任何危害——实际上没有危害。再次感谢。