Lua:如何循环遍历一个非固定域
Lua: How to Loop Through a non-Fixed Domain
我通常使用Lua生成一个数据文件,其中包含表达式已知的曲线的坐标。然后我用其他程序绘制曲线。
但是,我还想绘制通过使参数在第一个图的表达式中变化而获得的曲线。
例如,我想以 y=x^1
、y=x^1.5
、y=x^2
等形式绘制幂,其中我所说的参数是指数(即, 1, 1.5, 2, 等等).
这里是我 post 我通常工作流程的一个例子(我希望代码比我自己解释得更好):
-- test.lua
function POWER(x, y)
return x^y
end
local xmin = 0 -- x: the abscissa
local xmax = 10
local xstep = 0.1
local ymin = 1 -- y: the parameter
local ymax = 2
local ystep = 0.5
local A = {}
local ix = 1 -- dummy variable to index A as an array
for I = xmin, xmax, xstep do
A[ix] = {}
A[ix].x = I
A[ix].y = {}
for J = ymin, ymax, ystep do
table.insert(A[ix].y, POWER(I, J))
end
ix = ix + 1
end
local Out = io.stdout
--local Out = io.open("powerOUT.dat", "w")
Out:write(" x x^1 x^1.5 x^2\n") -- from here on out I have to adjust things manually if I change ymin, ymax or ystep
for _, v in ipairs(A) do
Out:write(string.format("%5.2f %10f %10f %10f\n",
v.x, v.y[1], v.y[2], v.y[3]))
end
这是我得到的摘录:
x x^1 x^1.5 x^2
0.00 0.000000 0.000000 0.000000
0.10 0.100000 0.031623 0.010000
0.20 0.200000 0.089443 0.040000
0.30 0.300000 0.164317 0.090000
...
xmin
,...,ymin
,... 的问题是我想让程序“自动”(即,我想更改其中一些变量并相应地更改数据文件。)截至目前,该过程是自动使用横坐标 x
(我可以更改域和样本数),但不使用参数 y
(参见我 post 编辑的代码。)
所以问题是:如何在不手动调整输出的情况下更改 y
变量的值时向我的数据文件添加列?
在这个例子中,这个问题转化为:我怎样才能改变(比如)ymax
和 ystep
到 ymax=5
和 ystep=0.25
而不手动更改脚本末尾的 :write
语句?
N.B。此外,数据文件的第一行应根据新值进行调整。
这是我想要得到的:
x x^1.00 x^1.25 x^1.50 x^1.75 x^2.00 x^2.25 x^2.50 x^2.75 x^3.00 x^3.25 x^3.50 ...
0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 ...
0.10 0.100000 0.056234 0.031623 0.017783 0.010000 0.005623 0.003162 0.001778 0.001000 0.000562 0.000316 ...
0.20 0.200000 0.133748 0.089443 0.059814 0.040000 0.026750 0.017889 0.011963 0.008000 0.005350 0.003578 ...
0.30 0.300000 0.222025 0.164317 0.121608 0.090000 0.066607 0.049295 0.036482 0.027000 0.019982 0.014789 ...
...
附带说明一下,我承认我的程序可能不是最佳的,因此欢迎提出任何建议。我的工作流程背后的总体思路是,我将所有数据存储在一个数组中,因为使用 ipairs()
.
可以很简单地打印我以“正确顺序”获得的结果
基本上,因为列数可能会发生变化,所以我们可以使用循环遍历所有列并逐列打印,而不是逐行打印。只需用下面的代码替换输出部分,并将 ymin、ymax 和 ystep 更改为您想要的任何值。边走边打印也是另一种选择。
Out:write("pos ")
for y = ymin, ymax, ystep do
Out:write(string.format("y=%-5.2f ", y))
end
Out:write("\n")
for _, v in ipairs(A) do
Out:write(string.format("%5.2f ", v.x))
for _, y in ipairs(v.y) do
Out:write(string.format("%10f ", y))
end
Out:write("\n")
end
我通常使用Lua生成一个数据文件,其中包含表达式已知的曲线的坐标。然后我用其他程序绘制曲线。
但是,我还想绘制通过使参数在第一个图的表达式中变化而获得的曲线。
例如,我想以 y=x^1
、y=x^1.5
、y=x^2
等形式绘制幂,其中我所说的参数是指数(即, 1, 1.5, 2, 等等).
这里是我 post 我通常工作流程的一个例子(我希望代码比我自己解释得更好):
-- test.lua
function POWER(x, y)
return x^y
end
local xmin = 0 -- x: the abscissa
local xmax = 10
local xstep = 0.1
local ymin = 1 -- y: the parameter
local ymax = 2
local ystep = 0.5
local A = {}
local ix = 1 -- dummy variable to index A as an array
for I = xmin, xmax, xstep do
A[ix] = {}
A[ix].x = I
A[ix].y = {}
for J = ymin, ymax, ystep do
table.insert(A[ix].y, POWER(I, J))
end
ix = ix + 1
end
local Out = io.stdout
--local Out = io.open("powerOUT.dat", "w")
Out:write(" x x^1 x^1.5 x^2\n") -- from here on out I have to adjust things manually if I change ymin, ymax or ystep
for _, v in ipairs(A) do
Out:write(string.format("%5.2f %10f %10f %10f\n",
v.x, v.y[1], v.y[2], v.y[3]))
end
这是我得到的摘录:
x x^1 x^1.5 x^2
0.00 0.000000 0.000000 0.000000
0.10 0.100000 0.031623 0.010000
0.20 0.200000 0.089443 0.040000
0.30 0.300000 0.164317 0.090000
...
xmin
,...,ymin
,... 的问题是我想让程序“自动”(即,我想更改其中一些变量并相应地更改数据文件。)截至目前,该过程是自动使用横坐标 x
(我可以更改域和样本数),但不使用参数 y
(参见我 post 编辑的代码。)
所以问题是:如何在不手动调整输出的情况下更改 y
变量的值时向我的数据文件添加列?
在这个例子中,这个问题转化为:我怎样才能改变(比如)ymax
和 ystep
到 ymax=5
和 ystep=0.25
而不手动更改脚本末尾的 :write
语句?
N.B。此外,数据文件的第一行应根据新值进行调整。
这是我想要得到的:
x x^1.00 x^1.25 x^1.50 x^1.75 x^2.00 x^2.25 x^2.50 x^2.75 x^3.00 x^3.25 x^3.50 ...
0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 ...
0.10 0.100000 0.056234 0.031623 0.017783 0.010000 0.005623 0.003162 0.001778 0.001000 0.000562 0.000316 ...
0.20 0.200000 0.133748 0.089443 0.059814 0.040000 0.026750 0.017889 0.011963 0.008000 0.005350 0.003578 ...
0.30 0.300000 0.222025 0.164317 0.121608 0.090000 0.066607 0.049295 0.036482 0.027000 0.019982 0.014789 ...
...
附带说明一下,我承认我的程序可能不是最佳的,因此欢迎提出任何建议。我的工作流程背后的总体思路是,我将所有数据存储在一个数组中,因为使用 ipairs()
.
基本上,因为列数可能会发生变化,所以我们可以使用循环遍历所有列并逐列打印,而不是逐行打印。只需用下面的代码替换输出部分,并将 ymin、ymax 和 ystep 更改为您想要的任何值。边走边打印也是另一种选择。
Out:write("pos ")
for y = ymin, ymax, ystep do
Out:write(string.format("y=%-5.2f ", y))
end
Out:write("\n")
for _, v in ipairs(A) do
Out:write(string.format("%5.2f ", v.x))
for _, y in ipairs(v.y) do
Out:write(string.format("%10f ", y))
end
Out:write("\n")
end