Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.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
Arrays Lua中的三维表格_Arrays_Multidimensional Array_Lua_Lua Table - Fatal编程技术网

Arrays Lua中的三维表格

Arrays Lua中的三维表格,arrays,multidimensional-array,lua,lua-table,Arrays,Multidimensional Array,Lua,Lua Table,我需要最好的方式来存储像素的三维表格。我需要做的是有多个x,y表(基本上是三维的),它是光栅多个二维像素地图的透明度。你看,我可以像这样轻松地创建两个维度: pixels = {{},{}} pixels[1][5] = "green" --just an example print(pixels[1][5]) 但是,我不能像在Java中那样做 pixels = {{}, {}, {}} pixels[1][4][3] = "red" -- [x][y][z] print(pixels[1][

我需要最好的方式来存储像素的三维表格。我需要做的是有多个x,y表(基本上是三维的),它是光栅多个二维像素地图的透明度。你看,我可以像这样轻松地创建两个维度:

pixels = {{},{}}
pixels[1][5] = "green" --just an example
print(pixels[1][5])
但是,我不能像在Java中那样做

pixels = {{}, {}, {}}
pixels[1][4][3] = "red" -- [x][y][z]
print(pixels[1][4][3])
这是我想要的功能,但我已经通过这样做来绕开它

pixels = {}
pixels["x23,y02,z05"] = "green"
print(pixels["x23,y02,z05"]")
我只是使用string.sub和string.concat来读取和设置表格。。。我确实希望示例2的功能能够正常工作,但是我知道它可能需要以不同的方式实现

在您的第一个代码中:

pixels = {{},{}}
相当于:

pixels = {}
pixels[1] = {}
pixels[2] = {}
在这里,
pixels[1]
已经是一个表,这就是为什么您可以为
pixels[1][5]
赋值

但在你的第二段代码中:

pixels = {{}, {}, {}}
这里,
像素
仍然是一个二维数组(包含3个元素)。这相当于:

pixels = {}
pixels[1] = {}
pixels[2] = {}
pixels[3] = {}
pixels[1]
是一个表,但
pixels[1][4]
不是。您需要做的是为
像素[1][4]
提供如下表构造函数:

pixels = {{}, {}, {}}
pixels[1][4] = {}   --initialize it to an empty table
pixels[1][4][3] = "red"
print(pixels[1][4][3])

除了经典的“array-In-array-In-array”方案外,您还可以利用Lua表内部的优点。怎么用?Lua表只是一个从键到值的映射,当您将它用作数组时,您可能会跳过一些键,而这几乎不需要任何成本

t = { }
t[1] = "Hello"
t[500000] = "World" -- does NOT allocate additional 499999 elements
因此,如果数据稀疏(超过50%的3d点没有价值),您可能会从中受益:

local n_x, n_y, n_z = 1920, 1080, 1000
local n_xy = n_x * n_y

function setValue(t, x, y, z, value)
    assert(x > 0 and x < n_x)
    assert(y > 0 and y < n_y)
    assert(z > 0 and z < n_z)

    t[((z-1) * n_xy) + ((y-1) * n_z) + x] = value
end

function getValue(t, x, y, z)
    assert(x > 0 and x < n_x)
    assert(y > 0 and y < n_y)
    assert(z > 0 and z < n_z)

    return t[((z-1) * n_xy) + ((y-1) * n_z) + x]
end

t = { }
setValue(t, 1, 1, 1, "red")
setValue(t, 1, 1, 2, "green")
本地n_x,n_y,n_z=1920108010000
局部n_xy=n_x*n_y
函数设置值(t、x、y、z、值)
断言(x>0和x0和y0和z0和x0和y0和z
基本上有两种方法

自动表格 自动表使用元表透明地生成子表,基本上在创建它之后,您应该能够忘记它们

function newAutotable(dim)
    local MT = {};
    for i=1, dim do
        MT[i] = {__index = function(t, k)
            if i < dim then
                t[k] = setmetatable({}, MT[i+1])
                return t[k];
            end
        end}
    end

    return setmetatable({}, MT[1]);
end

-- Usage
local at = newAutotable(3);
print(at[0]) -- returns table
print(at[0][1]) -- returns table
print(at[0][1][2]) -- returns nil
at[0][1][2] = 2;
print(at[0][1][2]) -- returns value
print(at[0][1][3][3]) -- error, because only 3 dimensions set
以及直接访问三维索引:

mdt(12, 13, 14, 0)

您还可以通过向元表添加一个
\u index
字段或使表保存矩阵维度等,轻松修改函数以返回缺少键的默认值。

谢谢!每次我需要添加一个像素的时候,我都要初始化它吗?例如:对于i=1,50像素[i][i]={}像素[i][i][i]=“红色”结束,你知道。。。实际上,我会在for循环中创建一个for循环,但每次调用initilization是否正确?@user3214283在访问或分配其成员之前,请确保它已经是一个表。如果它已经是一张桌子,你就不需要再做了。谢谢你的自动调整功能!
for i=1, #mdt
    mdt[i] = (mdt[i] or 0)*.5
end
mdt(12, 13, 14, 0)