別のマトリックス (またはリスト) を使用してマトリックス (またはリスト) にインデックスを作成することは、スクリプトを高速かつ小さくするための強力な手法ですが、心配すべきエッジ ケースが 1 つあります。これについては、JMP 13 で修正しています。 おそらく、「修正」を引用符で囲む必要があります。変更は潜在的に混乱を招くため、JMP 13 の前にここで説明したいと思います。
データ列へのインデックスとして行列を使用する例を次に示します。
Open("$SAMPLE_DATA/Big Class.jmp");
tall rows = Loc(:height << Get Values() >= 67); // [25, 27, 30, 37, 39, 40]
:height[tall rows]; // [68, 69, 67, 68, 68, 70]
N Rows(:height[tall rows]); // 6
このスタイルのプログラミングに慣れていない場合は、2 行目が重要です。 " :高さ << Get Values() " は、高さ列の値を行列として返します。 比較 " >= 67 " は、式が false (0) または true (1) である場所に対応する 0 と 1 の行列を返します。 のロク()関数は、前の行列内の 1 の位置を返します。
この場合、高さ列が 67 以上の行番号として [25, 27, 30, 37, 39, 40] を取得します。 それ自体は非常に便利ですが、真の力は、3 行目と 4 行目のように、その行列を列または他の行列のインデックスとして使用できることにあります。
この手法に代わる方法は、For() ループを記述して、すべての行を明示的に反復処理することです。 もちろん、JMP はどちらの場合でも行をループ処理していますが、JSL で実行するよりも内部で実行した方がはるかに高速です。 また、明示的なループがなければ、JSL はよりコンパクトになります。
データ列参照の代わりに、行列変数を使用して同じことを行うことができます。
m = :height << Get Values();
tall rows = Loc(m >= 67); // [25, 27, 30, 37, 39, 40]
m[tall rows]; // [68, 69, 67, 68, 68, 70]
N Rows(m[tall rows]); // 6
これまでのところすべて素晴らしいです。 高さのカットオフが異なる同じ例を見てみましょう (67 ではなく 70):
tall rows = Loc(:height << Get Values() >= 70); // [40]
:height[tall rows]; // [70]
N Rows(:height[tall rows]); // 1
m = :height << Get Values();
tall rows = Loc(m >= 70); // [40]
m[tall rows]; // 70
N Rows(m[tall rows]); // error
何が悪かったのか? data[tall rows] が [70] ではなく 70 を返したことに注意してください。 多くの場合、1x1 行列と数値は同じように扱われますが、常にそうとは限りません。 N Rows() 関数は、違いを生む 1 つの例です。 インデックス付けは、1x1 マトリックスを数字に「単純化」するという積極的な行為です。
1 つの回避策は、電話することです。マトリックス()使用する前にN行() . もう 1 つは、空の行列を結果に連結することです。これにより、ソースが数値であるか行列であるかに関係なく、行列が作成されます。
m = m |/ [];
JMP 13 では、1x1 マトリックスが維持されるため、インデックス自体が行列である場合は常に、インデックス操作の結果は行列になります. 同じことがリストのインデックス作成にも当てはまり、データ列のインデックス作成にも既に適用されています。
トリガーは一般的ではなく、1x1 マトリックスと数値はいずれにしても同じように扱われることが多いため、混乱はまれであると予想されます。 それにもかかわらず、JMP 13 デバッガーには、変更によって影響を受ける可能性のあるスクリプト内の場所を特定する機能があります。
ご意見やご不明な点がございましたら、こちらからお知らせいただくか、お問い合わせくださいダニエルバレンテJMP 13 Early Adopter プログラムの資格があるかどうかを確認して、独自のコードで変更を試してみてください。
デバッガーでこれに対するブレーク警告をオフにするにはどうすればよいですか?再生をクリックし続ける必要があり、プロファイラーが機能しないようです。動かなくなって、もう再生を押すことができません。
*編集* 気にしないでください。そのためのオプションを見つけました。ありがとう
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />同意します。インデックスが統一されているのは良いことです。空の行列を形状で作成できるという事実が気に入っています。
大きな改善。 行列に関する別の提案は次のとおりです。条件を使用している場合は、インデックス作成を簡素化します。 これは、例を通して最もよく説明されています。 5 より大きい値を見つけて返したい行列があるとします。
mymatrix = [2,4,6,8,10];
newmatrix=mymatrix[loc(mymatrix>5)];
これを R の同様のコードと比較してください。
mymatrix = matrix(cbind(2,4,6,8,10));
newmatrix=mymatrix[mymatrix>5];
R の最初のステートメントは長く、2 番目のステートメントは行列ではなくベクトルを返しますが、2 番目のステートメントは短いです。 将来のバージョンでは、JMP が 2 番目のステートメントでより単純な構文を実装できるとよいでしょう。
単一値行列の新しい処理が改善されていることに同意しますが、紛らわしい空の行列出力 [](0,1) を削除するという Mark Bailey の要求にも同意します。 [] に置き換えると、ユーザーにとって理解しやすく、扱いやすくなります。 私は通常、次のようなロジックを使用してこの状況を処理します。
dt=current data table();
rows_to_capture=dt<<GET rows="" where=""></GET>
ゼロ以外の次元を持つさまざまな空行列を区別します。形状が重要な場合があります。
show(x00,nrows(x00),ncols(x00));
show(x10,nrows(x10),ncols(x10));
show(x01,nrows(x01),ncols(x01));
show(x11,nrows(x11),ncols(x11));
x00 = [];
N Rows(x00) = 0;
N Cols(x00) = 0;
x10 = [](1, 0);
N Rows(x10) = 1;
N Cols(x10) = 0;
x01 = [](0, 1);
N Rows(x01) = 0;
N Cols(x01) = 1;
x11 = [1];
N Rows(x11) = 1;
N Cols(x11) = 1;
高度なスクリプト コースでは、結果が空の行列であるが、実際に返されるのは次のようなケースがあります。 [](0,1) ..この形式は無害に見えますが (つまり、単純な空行列のように動作します)、常に説明が必要です。 は何をしますか(0,1)表し、どのように使用されますか? それが何の意味も持たず、何の役にも立たない場合は、削除することを検討してください。
この例外を処理しなければならないコードがたくさんあります。これは確実な改善です。お知らせいただきありがとうございます。この状況を処理するために使用したコードの現在のパターンにどのように影響するかを見ていきます。
私は頭を上げて感謝します.......これは正しい方向です.....