비디오용 JSL.
picpath = ""; // "D:\Chales\pic\m";
//http://www.fractalforums.com/mandelbrot-and-julia-set/good-coordinates-for-mandelbrot-zooms/
//
//Points on the boundary of the Mandelbrot set generally have the most interesting orbits. The easiest boundary points to compute are:
//
//* the spike along the negative real axis
//* the boundary of the main cardioid: r = (1 - cos(theta))/2, x = r*cos(theta)+0.25, y = r*sin(theta)
//* the boundary of the period 2 disk: r = 0.25, x = r*cos(theta)-1, y = r*sin(theta)
eps = 1.6; // slightly outside
deep = 10;
steps = 8000;
angle = 3;
scale = 2; // <<<<<<< video made with 20, very slow
xsize = 192 * scale;
ysize = 108 * scale;
diag = Sqrt( xsize ^ 2 + ysize ^ 2 );
mat = J( ysize, xsize, . );
New Window( "mandelbrot", bb = Border Box( Text Box( "wait" ) ) );
Wait( .2 );
num = 1e6;
For( t = 0, t < steps, t += 1,
If( eps > 1e-9, eps *= .997 );
deep += .3;
angle += eps / 50;
radius = (1 - Cos( angle )) / 2 + eps;
x = radius * Cos( angle ) + 0.25;
y = radius * Sin( angle );
top = y - eps;
bottom = y + eps;
left = x - eps * xsize / ysize;
right = x + eps * xsize / ysize;
d = Floor( Min( 1e5, deep ) );
Parallel Assign( {d = d}, mat[r( top, bottom ), c( left, right )] = Mandelbrot( d, 4, c, r ) );
mat = mat / d;
red = mat ^ .5;
green = mat ^ 9;
both = Loc( red :*</img> green == 1 );
red[both] = .1;
green[both] = .4;
blue = 1 - mat ^ .2;
blue[both] = .1;
img = New Image( "rgb", {red, green, blue} );
(bb << child) << delete;
bb << append( img );
num += 1;
If( picpath != "", img << saveimage( picpath || Char( num ) || ".png" ) );
bb << updatewindow;
Wait( 0 );
);
좋아요, 첫 번째가 가장 어렵습니다. 저는 ffmpeg를 직접 사용하는 대신 Blender(내부적으로 ffmpeg를 사용함)를 사용하여 약간 다른 경로를 선택했습니다. 나는 ffmpeg 매개변수에 대한 일부 제어권을 포기하고(학습하는 데 시간을 보내고 싶지 않았습니다) 그 대가로 꽤 멋진 비디오 시퀀스 편집기를 얻습니다(자체적으로 상당한 학습 곡선이 있음).
Parallel Assign()에 대한 자세한 정보를 제공해 주셔서 감사합니다!내 두뇌는 그것을 어떻게 사용할 수 있을지에 대한 아이디어로 헤엄치고 있습니다.
내가 문서화한 적이 없는 것 같은데, 내가 무엇을 할 수 있는지 알아보겠습니다.
예, 위쪽..아래쪽으로 1..nrows의 선형 보간을 수행합니다. (c, ncols, 왼쪽, 오른쪽과 유사)
(top,bottom) 비트를 생략하면 표현식의 r 값은 1..nrows가 됩니다.
{d = d} 부분도 설명이 필요합니다. 각 스레드는 참조해야 하는 모든 항목의 자체 복사본을 가져옵니다. 왼쪽 변수는 작업자 스레드의 이름이고 오른쪽은 기본 스레드의 이름입니다. 4-CPU 시스템에서는 할당이 4번 수행됩니다. 복사하는 거대한 행렬인 경우 성능 향상이 나타나지 않을 수 있습니다.
Mandelbrot는 다른 데이터가 필요하지 않으며 훌륭하게 확장됩니다. 대부분의 실제 문제는 다른 어레이에서 읽어야 하며 일부 장부를 수행해야 할 수도 있습니다.
덮개 아래를 엿보고 싶다면 다음을 시도해 보세요.
m=J(10,10,0);
x=0;
parallelassign({x=x++},m[r,c]=x);
show(x,m);
내 8-cpu 컴퓨터는 다음을 생성합니다.
x = 8;
m =
[ 0 1 2 3 4 5 6 7 0 1,
2 3 4 5 6 7 0 1 2 3,
4 5 6 7 0 1 2 3 4 5,
6 7 0 1 2 3 4 5 6 7,
0 1 2 3 4 5 6 7 0 1,
2 3 4 5 6 7 0 1 2 3,
4 5 6 7 0 1 2 3 4 5,
6 7 0 1 2 3 4 5 6 7,
0 1 2 3 4 5 6 7 0 1,
2 3 4 5 6 7 0 1 2 3];
물론 해당 패턴에 의존하는 코드를 작성해서는 안 됩니다.
또한 행렬 할당의 오른쪽이 더 복잡할 수 있다는 점에 유의하세요.
m=J(400,600,0);
parallelassign({},m[r(-1,1),c(-1,1)]=(
z=sqrt(r^2+c^2);
z=if(z<.707,.707,z)-.5;
1-z; // last item in ; sequence is result
));
m=m/max(m); // for heat color
newwindow("example",newimage(heatcolor(m,"spectral")));
"z"는 각 스레드 내부에만 존재하며 각각에 대한 별도의 복사본입니다.
That flat area, dark red, was created by the if statementThat flat area, dark red, was created by the if statementThat flat area, dark red, was created by the if statementThat flat area, dark red, was created by the if statement짙은 빨간색의 평평한 영역은 if 문에 의해 생성되었습니다.
그리고 네, for 문을 사용할 수 있습니다. 로그에 기록하는 것 외에는 어떤 형태의 I/O도 시도해서는 안 됩니다. 표시 상자를 만들지 말고, 표시 상자를 업데이트하지 말고, 디스크 파일을 읽거나 쓰지 마세요. 충돌하지 않더라도 여전히 잘못된 것입니다.
전역 변수를 사용할 수 있지만 뮤텍스를 사용하여 액세스를 직렬화하므로 코드가 스레드되지 않은 코드보다 빠르지 않을 수 있습니다.
m=J(3,5,0);
global:words="";
parallelassign({},m[r(-1,1),c(-1,1)]=(
z=sqrt(r^2+c^2);
show(r+0,c+0,r+c,z); // r and c are special, use an expression
global:words||=char(z);
z=if(z<.707,.707,z)-.5;
1-z; // last item in ; sequence is result
));
show(words);
global:words는 서로 다른 스레드가 얼마나 빨리 실행되는지에 따라 결정되는 예측할 수 없는 순서로 구축됩니다.
JSL은 (내부적으로) 복잡하고 스레딩도 마찬가지입니다. 병렬 할당 기능은 모든 것(예를 들어 복사본)을 정상 상태로 유지하려고 합니다. 방해가 되는 작업을 해결하는 방법을 찾았다면 두 스레드가 동시에 내부 데이터 구조에 액세스할 때 내부 데이터 구조가 손상될 수 있으며 이로 인해 어느 시점에서 JMP가 중단될 수 있습니다. 자주 저장하세요.
아...1D 행렬에 대한 마지막 참고 사항: 두 개의 첨자를 사용하세요! 1xN 행 벡터가 있고 단일 첨자를 사용하려고 하면 혼란스러운 상황이 있습니다. R,C를 사용하고 상수 R==1 값을 무시합니다.
나는 이 스크립트를 가지고 약간의 수정을 하고 이미지 시리즈를 만들어 비디오로 변환하여 나만의 만델브로트 투어를 만드는 등 즐거운 시간을 보냈습니다.
질문: Parallel Assign() 함수 - 이에 대한 구문 참조를 찾고 있습니까?JMP 스크립팅 책에는 없지만 JMP 스크립팅 가이드 도움말 아래에 항목이 있습니다.스크립트에서 병렬 할당 기능을 사용하여 무엇을 하고 있는지 명확하지 않습니다.
Parallel Assign( {d = d}, mat[r( top, bottom ), c( left, right )] = Mandelbrot( d, 4, c, r ) );r(상단,하단)과 c(왼쪽, 오른쪽)은 무엇을 합니까?위쪽, 아래쪽, 왼쪽 및 오른쪽은 생성 중인 프레임의 좌표 경계를 결정하기 위해 스크립트 직전에 결정됩니다.사용할 y 및 x 좌표를 얻기 위해 위쪽, 아래쪽, 왼쪽, 오른쪽 사이에 일종의 보간을 수행한다고 가정합니까?이 구문에 대한 일반적인 설명이 어딘가에 있습니까?