2015-01-05 3 views
1

보통 루아를 사용하여 표현이 알려진 커브의 좌표를 포함하는 데이터 파일을 생성합니다. 그런 다음 다른 프로그램으로 커브를 그립니다.루아 : 고정되지 않은 도메인을 반복하는 방법

그러나 첫 번째 플롯의 표현에서 매개 변수를 변경하여 얻은 커브를 플롯하려고합니다. I 소릴하고 파라미터 지수 (즉, 1, 1.5, 2 등)이다

예로

, I는 y=x^1, y=x^1.5, y=x^2 등의 형태로 힘을 플롯하고 싶다. 여기

내 일반적인 작업 흐름의 예를 게시 (나는 것보다 코드가 더 나은 자신을 설명 희망) : 여기

-- 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의 문제는 ... "자동"(즉, 이러한 변수 중 일부 값을 변경하고 이에 따라 데이터 파일을 변경하고 싶습니다.) 절차를 만들고 싶습니다.) 현재, 절차는 자동으로 가로 좌표는하지만 매개 변수 y와, (I 도메인 및 샘플의 수를 변경할 수 있습니다)

그래서 질문입니다 (내가 게시 된 코드를 참조하십시오.) : 나는이 변경 될 때 가 어떻게 내 데이터 파일에 열을 추가 할 수 있습니다 수동으로 출력을 조정하지 않고도 y- 값의 값을 변경 하시겠습니까? 이 예에서

이 질문에 번역 : 내가 어떻게 바꾸 ymaxymax=5-ystepystep=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()을 사용하여 "올바른 순서"로 얻은 결과를 간단하게 인쇄 할 수 있기 때문입니다.

+1

얼마나 많은 'y'값을 가질 지 모를 때 줄을 인쇄하는 방법에 대한 질문이 있습니까? 그렇다면 대답은 그럴 가능성이 있습니다. –

+1

나에게, 당신이 무엇을 요구하고 있는지 분명하지 않다. 여기서 자동이란 무엇을 의미합니까? 2.5와 같이 새 y 값에 대해 새 열을 추가하고 해당 열을 파일에 추가 할 수있게 하시겠습니까? 코드가 어떻게 보이고 원하는 출력이 도움이 될지를 보여주는 예제입니다. – ryanpattison

+0

@rpattiso : 저는 ymax와 ystep을 ymax = 5와 ystep = 0으로 바꾸고 싶습니다.25 스크립트의 끝에 ": write"문을 수동으로 수정하지 않고도 상대 열을 출력에 추가 할 수 있습니다. –

답변

3

기본적으로 열의 수가 변경 될 수 있으므로 루프를 사용하여 모든 열을 반복하고 한 행씩 열별로 인쇄 할 수 있습니다. 출력 섹션을 아래 코드로 바꾸고 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 
+0

완벽! 나는 단 한가지 의문점을 가지고있다 : 수천 개의 값을 가진 데이터 파일을 가지고 있기 때문에,'Out : write()'가 _lot_ 번 발행되었다는 사실을 고려할 때 성능에 관한 문제가 있는가? –

+1

@PierPaolo 당신의 OS는 당신의 호출을 버퍼링 할 것입니다. 버퍼가 꽉 찼을 때마다 모든 호출을 파일에 기록하지 않거나, 개행이 그것도 플러시 할 것입니다. – ryanpattison

관련 문제