ビデオの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 から top..bottom への線形補間を行います。 (c、ncols、左、右と同様)。
(top,bottom) ビットを省略すると、式の r 値は 1..nrows になります。
{d = d} の部分も説明が必要です。 各スレッドは、参照する必要があるすべての独自のコピーを取得します。左側の変数はワーカー スレッドの名前で、右側の変数はメイン スレッドの名前です。 4-cpu マシンでは、その割り当ては 4 回行われます。 たまたまコピーしている巨大なマトリックスである場合、パフォーマンスの向上が見られない場合があります。
マンデルブロは他のデータを必要とせず、適切にスケーリングします。 実際の問題のほとんどは、別の配列から読み取る必要があり、簿記も行う必要があります。
カバーの下をのぞき見したい場合は、これを試してください:
m=J(10,10,0);
x=0;
parallelassign({x=x++},m[r,c]=x);
show(x,m);
私の8-cpuマシンはこれを生成します:
x = 8;
メートル=
[ 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 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 は (内部的に) 複雑で、スレッド化も複雑です。 parallelassign 関数は、すべてを正常に保とうとします (たとえば、これらのコピー)。 2 つのスレッドが同時に内部データ構造にアクセスすると、JMP がクラッシュする原因となる可能性があります。 頻繁に保存します。
ああ... 1D 行列に関する最後の注意: 2 つの添字を使用してください! 1xN の行ベクトルがあり、1 つの添え字を使用しようとすると、混乱する状況がいくつかあります。 R,C を使用し、定数 R==1 の値を無視します。
私はこのスクリプトを楽しんでおり、いくつかの変更を行い、画像シリーズを作成してビデオに変換し、独自のマンデルブロ ツアーを作成しています。
質問: Parallel Assign() 関数 -- 構文リファレンスを探していますか?JMP スクリプト ブックには記載されていませんが、JMP スクリプト ガイドの [ヘルプ] の下にエントリがあります。あなたのスクリプトで Parallel Assign 関数を使用して何をしているのか、私にはわかりません。
Parallel Assign( {d = d}, mat[r( top, bottom ), c( left, right )] = Mandelbrot( d, 4, c, r ) );r(上、下)とc(左、右)は何をしますか?上、下、左、右は、作成するフレームの座標境界を決定するために、スクリプトの直前で決定されます。使用するy座標とx座標を取得するために、上、下、左、右の間で何らかの補間を行っていると思いますか?この構文の一般的な説明はどこかにありますか?
ようこそ、そしてありがとう! ビデオのレンダリングにも数時間かかりましたが、解像度は 4K、フレーム数は 1000 です。
作り始めましたGKS 80年代の番組。フラクタルをレンダリングするには、microVAX の計算時間が何時間もかかります。共有してくれてありがとう。