gpt4 book ai didi

matrix - Lua 中令人困惑的矩阵生成示例

转载 作者:行者123 更新时间:2023-12-02 04:38:52 27 4
gpt4 key购买 nike

如果你想在 Lua 中创建 NxM 矩阵,你基本上需要执行以下操作:

function get_zero_matrix(rows, cols)
matrix = {}
for i=1, rows do
matrix[i] = {}
for j=1, cols do
matrix[i][j] = 0
end
end
return matrix
end

但是,在Lua官方网站上我看到了second variant :

function get_zero_matrix2(rows, cols)
mt = {}
for i=1, rows do
for j=1, cols do
mt[i*cols + j] = 0
end
end
return mt
end

首先,我不明白它是如何工作的。 [i*M + j] 索引应该如何创建行和列?其次,我尝试了这个变体,它有效,但它返回的实际上是一个数组,而不是 NxM 矩阵:

M = function get_zero_matrix2(10, 20)
print(#M, #M[1])

> attempt to get length of a nil value (field '?')

您能解释一下第二个变体是如何工作的吗?也许我误解了它。

最佳答案

I don't understand how it works.

对于维度为 N(行)x M(列)的二维数组,所需元素总数 = N * M 。现在一次性创建 N * M 元素作为单个数组,我们基本上在内存中拥有一个一维数组(展平的二维数组)。由于该公式假定数组索引开始为 0 而不是 1(通常的 Lua 约定),因此我们将遵循 0:第一个 M 个带有索引 [0, M - 1] 的项目形成行 0,接下来的 M 个带有索引 [ M, 2M - 1] 形成行 1,依此类推。

5 x 2 数组的内存布局;此一维数组中的索引 4 是二维数组中的 (2, 0)

   --+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-- ... | 0,0 | 0,1 | 1,0 | 1,1 | 2,0 | 2,1 | 3,0 | 3,1 | 4,0 | 4,1 | ...   --+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+--     |-- row 0 --|-- row 1 --|-- row 2 --|-- row 3 --|-- row 4 --|

要访问元素 (i, j),需要先经过 i - 1 行,然后访问第 j 行第 ith 行上的 项。但索引已经小了 1,因为索引从 0 开始,所以 i 可以按原样使用。因此 i * rows + j 给出了正确的索引。

How [i*M + j] index is supposed to create rows and columns?

事实并非如此。它是一维数字数组的抽象,给出了矩阵的接口(interface)。在像 C 这样的语言中,声明一个 2D 数组,大多数实现都会做类似的事情。 int a[2][3] 将创建一个包含 6 个整数的数组,并使用上面的公式进行索引,因此这并不是一种罕见的模式。

关于matrix - Lua 中令人困惑的矩阵生成示例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34744166/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com