Animated gif of random green letters with random red J, M, and P charactersランダムな緑色の文字とランダムな赤色の J、M、および P の文字のアニメーション GIF
JMP には、JSL スクリプト言語の強力な行列プリミティブのセットが含まれています。 ここでは、JSL で 1D および 2D 行列を作成および使用する方法を紹介します。
3 行 x 2 列の行列の JSL 行列定数は次のようになります。行の要素間のスペースと行間のカンマに注目してください。
constant = [
1 2,
3 4,
5 6
];
そのコードを実行すると、ログ ウィンドウに次のように表示されます (1 行で記述することもできます)。
[1 2, 3 4, 5 6]
角括弧は、JSL の解析時に作成される定数を定義します。 変数が存在する前にパーサーが実行されるため、角括弧内で他の JSL 変数を使用することはできません (これについては後ほど詳しく説明します)。 1D 行列を使用したさらに 2 つの例:
RowVector = [1 2];
ColVector = [3,4];
JSL には行列を作成するための関数がいくつかあります。 私は通常 J( nRows, nCols, init ) を使用し、3 番目には 0 を使用します初期化価値。
squareOnes = J(5);
[1 1 1 1 1,
1 1 1 1 1,
1 1 1 1 1,
1 1 1 1 1,
1 1 1 1 1]
diagOnes = identity(5);
[1 0 0 0 0,
0 1 0 0 0,
0 0 1 0 0,
0 0 0 1 0,
0 0 0 0 1]
colsAndRows = J(3,2,random integer(1,6));
[2 6, 2 5, 5 2]
値を水平または垂直に連結して行列を構築することもできます。 同じ連結演算子は、互換性のあるサイズを持つ行列を連結します (ここには示されていません)。
a=1;b=2;c=3;d=4;e=5; // now we can use variables as follows
row1 = a::e; // row
[1 2 3 4 5]
col1 = (a::e)`; // column - transpose operator
[1, 2, 3, 4, 5]
row2 = a||22||c||44||e; // row - concatenate horizontal
[1 22 3 44 5]
col2 = a|/222|/c|/444|/e; // column - concatenate vertical
[1, 222, 3, 444, 5]
US キーボードの左上にある小さな ` 文字は、行列転置演算子です。 :: 演算子は整数の行列を作成します。 スカラーを乗算し、スカラーを追加して、必要な結果行列を取得できます。
(0::9)*.1+100
[100 100.1 100.2 100.3 100.4 100.5 100.6 100.7 100.8 100.9]
行列には通常の方法で添字が付けられます。 JSL では行列の添え字は、一部の言語のように 0 ではなく 1 から始まります。
M = [
11 12 13 14 15,
21 22 23 24 25,
31 32 33 34 45
];
write(M);
[ 11 12 13 14 15,
21 22 23 24 25,
31 32 33 34 45]
write(M[2,3])
23
そして、強力な方法でスライスしたり、さいの目に切ったりすることができます。
write(M[2::3, 1::2]); // return a 2x2 sub-matrix
[21 22, 31 32]
write(M[1,0]); // 0 means the entire dimension
[11 12 13 14 15]
write(M[0,2::3]); // various combinations
[12 13, 22 23, 32 33]
JSL には、shape と呼ばれる行列関数があり、行ベクトルまたは列ベクトルを 2D 行列に再形成するのに役立つ場合があります。 行列には 2 つの乗算演算子があり、1 つは行列代数乗算 ( m1 * m2 ) 用で、もう 1 つは要素ごとの乗算用です。
[1 2, 3 4]
[2 3, 4 5]
[2 6, 12 20]
覚えておいてください:* 2 つの画像を乗算して本当に予期せぬ結果が得られた場合は、演算子を使用してください。
行列要素またはスライスに値を割り当てることもできます。
mat = J(2,3,.); // 2 rows, three columns, all missing
mat[1,1] = 7; // the top left corner
mat[0,2::3] = [5 9, 13 15]; // all rows, columns 2 and 3
write(mat); // notice the missing value that never got set
[7 5 9, . 13 15]
最後に、アニメーション GIF のコードは次のとおりです。ほとんど話題とは何の関係もありません。 これは、画像や文字を操作するために驚くべき方法で行列を使用しており、おそらく、最初に始めたい例ではありません。
matgif = "$desktop/mat.gif";
gb = Graph Box(framesize(500,300));
gb << setBackgroundColor( "black" );
gb << setGraphicsScript(
Text Color( "green" );
For( x = -10, x <= 110, x += Random Integer( 2, 4 ),
For( y = -10, y <= 110, y += Random Integer( 3, 7 ),
c = random integer(31,1000);
textcolor("green");
if( random integer(1,10000)<60,
textcolor("red");
c = blobtomatrix(chartoblob(substr("JMP", random integer(1,3),1)),"uint",1,"big")
);
Text( {x, y}, blobtochar(matrixtoblob(c::c,"uint",2,"big"),encoding="utf-16be") )
);
);
);
New Window( "x", gb );
duration=80;//ms
animation = gb[framebox(1)]<<GETPICTURE></GETPICTURE>
https://community.jmp.com/t5/Discussions/Near-neighbors-mean-calculation/mp/345727#M59633には、行列 M3 を別の行列 Indexer2x2 でインデックス付けして、M3 の部分行列を取得する例が示されています。 この例は、連続する長方形の領域を取得し、それを 2D 行列として返すように設計されていますが、インデクサーは要素の任意のセットを任意の順序で取得できます。項目の 1D 行列が必要な場合は、shape() 関数はオプションです。
M3 = [. . . . . . . . .,
. . . . . . . . .,
. . . . . . . . .,
. . . 1 2 3 . . .,
. . . 4 5 6 . . .,
. . . 7 8 9 . . .,
. . . . . . . . .,
. . . . . . . . .,
. . . . . . . . .];
indexer2x2 = [1 2 10 11]; // top left 2x2 sub-matrix
For( x = 2, x <= 5, x += 1,
For( y = 2, y <= 5, y += 1,
Write( "\!n ", x, " ", y, " ", Shape( M3[indexer2x2 + x + y * 9], 2 ) );
)
);
2 2 [。 、、。 1]
2 3 [。 1、。 4]
2 4 [。 4、。 7]
2 5 [。 7、 。 ]
3 2 [。 .、1 2]
3 3 [1 2、4 5]
3 4 [4 5、7 8]
3 5 [7 8、. ]
4 2 [。 .、2 3]
4 3 [2 3、5 6]
4 4 [5 6、8 9]
4 5 [8 9、. 。]
5 2 [。 .、3.]
5 3 [3 .、6 .]
5 4 [6 .、9 .]
5 5 [9.、. 。]