行列用のより強力な組み込みライブラリ関数機能1 :行列間の共通要素と非共通要素を見つける能力
2 つ以上の行列の要素数が奇数の場合に、それらの行列間で共通要素と非共通要素を判別できる組み込み関数を私は知りません。JSL でこれを実現する唯一の方法は、実際にデータをデータ テーブルに投入する以外に、次のとおりです。
A = Associative Array(Random Index(10,6));
Show(A);
B = Associative Array(Random Index(10,6));
Show(B);
Intersection = A ;
Intersection << Intersect(B);
Print(Intersection << Get Keys);
以下で@gzmorgan0が示すアプローチは、要素数が同じ行列にのみ適用されます。
機能 2 : 要素の位置を保持しながら行列をソートする機能 ( https://community.jmp.com/t5/Discussions/Sort-a-matrix/mp/85678#M38246 )
自動化とスクリプトRe: 行列の組み込みライブラリ関数の強化@gzmorgan0私はこのLFunc関数がとても気に入っています。
Re: 行列の組み込みライブラリ関数の強化@uday_guntupalli IsMember() 関数または Intersect の提案は良い提案だと思います。 ただし、この例では行列と数値のみを参照しています。 これは、あらゆるタイプのオブジェクトのリストに適した関数です。長年のウィッシュリスト項目には、セットの結合と交差、リスト内の各項目に文字列関数とリスト関数を適用する機能が含まれます。 JSL Companion 第 2 版の関連スクリプトには、結合関数と交差関数、Like および LFunc と呼ばれる関数のコードが含まれています。 よく使用されるカスタム関数のスクリプトを作成し、コード Include( "mypath/myfuncs.jsl" ); に含めることができます。 。 あとはスクリプト内でそれらを使用するだけです。 これらの機能のいくつかが組み込まれていると便利です。以下に説明がありますLFuncそしてのようにそして、あなたの例でそれらの関数を使用した結果。これら 2 つの関数を広範なコメントと例とともに定義するスクリプトの名前は次のとおりです。 JSLC_カスタムリスト関数.jsl元の場所のリクエストに関しては、列ソート行列については、Ian のソートを簡単に変更し、Rank() 関数を使用することで、今日必要なものが得られるはずです。
ここで定義される関数は次のとおりです。
- LFunc( mylist, expr);ここで、式は expr(Substr(x,1,1)) のようなものです。
- Like(SourceStr,SearchStr);両方の引数はテキスト/文字列です。 2 番目の引数では、% と * をワイルドカードとして使用します。 これは簡略化された正規表現であることに注意してください。
LFunc は for ループの作成を節約でき、Like は REGEX 構文の検索を節約できます。
A = {5,3,4,2};
B = {2,4,4,4,6,8};
_xx = LFunc(A, expr(Loc(B,x))); //returns {[], [], [2, 3, 4], [1]}
_yy = LFunc(A, expr(Contains(B,x)>0 ) ); //returns {0, 0, 1, 1}
_zz = LFunc(B, expr(Contains(A,x))); //returns {4, 3, 3, 3, 0, 0}
LFUNC
//------LFunc-------------------------------------------------------------------
Lfunc = Function( {xList, fExpr/*ex. Expr(Contains(x,"h"))*/},
{x = {}, i = 1, errCode = 0, errStr = "\!NError bad argument", newExpr},
If( !Is List( xList ),
errCode = 1
);
If(
Type( Name Expr( fExpr ) ) == "Name",
//if Name then JMP does not recognize the function
tmp = Trim( Char( Name Expr( fExpr ) ) );
//extract the function and check if it is contained in the global namespace, if not error!
If( Namespace( "global" ) << Contains( Word( 1, tmp, ":(" ) ) == 0,
errCode = errCode + 2
);,
Type( Name Expr( fExpr ) ) != "Expression", errCode = errCode + 2
);
//catches typos, returns Name if not a valid function
//catches typos, returns Name if not a valid function
If( !Is Expr( Name Expr( fExpr ) ),
errCode = errCode + 2
); //catches syntax
If(
!errCode,
For( i = 1, i <= N Items( xList ), i++,
newExpr = Substitute( Name Expr( fExpr ), Expr( x ), xList[i] );
Insert Into( x, Try( newExpr, Empty() ) );
),
errCode == 1, Write( errStr || "(1) not a list \!N" ),
errCode == 2, Write( errStr || "(2) not a valid expression \!N" ),
errCode == 3, Write( errStr || "s (1) is not a list and (2) is not a valid expression \!N" )
);
x//return x
;
); //End Lfunc
//------------------------------------------------------------------------------
Re: 行列の組み込みライブラリ関数の強化R では、次のようにして同じことが実現されます。

Matlab では、これは次のようにして実現されます。

Re: 行列の共通要素と非共通要素の関数@gzmorgan0 、
ありがとう。 また、以前の会話の更新ですが、行列が行ベクトルであるか列ベクトルであるかに応じて、行列の行数または列数が異なる場合、推奨するアプローチは機能しないと思います。
Re: 行列の共通要素と非共通要素の関数JSL Cオムニオン、JMP スクリプト言語のアプリケーション、第 2 版。
Re: 行列の共通要素と非共通要素の関数@gzmorgan0 、
JSLCとは何の略ですか?
Re: 行列の共通要素と非共通要素の関数元の投稿には次のように書かれていました。 2 つ以上の行列間の共通要素と非共通要素を決定できる組み込み関数を私は知りません。 」
それぞれ要素行列内の は値と位置で構成されます。 したがって、私はloc()一般的なものと珍しいものを見つける関数要素。一般的なものと珍しいものを要求した場合、あなたの投稿はより正確になったでしょう価値観。
興味がある場合は、インデックスを使用して、一般的な値と一般的ではない値、一致する行列と一致しない行列を取得できることに注意してください。
A= [2,3,4,7,8,9];
B= [2,4,5,6,7,9];
m_idx = loc(A==B);
u_idx = loc(A!=B);
m_mat = A[m_idx];
u_matA = A[u_idx];
u_matB = B[u_idx];
show(m_mat, u_matA, u_matB);
//or you can give a match or empty or unmatched and empty
x = J(5,4,RandomInteger(1,4));
y = J(5,4,RandomInteger(1,4));
e_mat = J(5,4,empty());
m_idx2 = loc(x==y);
u_idx2 = loc(x!=y);
matched_mat = e_mat;
matched_mat[m_idx2] = x[m_idx2];
unmatched_x = e_mat;
unmatched_y = e_mat;
unmatched_x[u_idx2] = x[u_idx2];
unmatched_y[u_idx2] = y[u_idx2];
show(x, y, matched_mat,unmatched_x,unmatched_y);
ただし、行列は数値です。JSLC v2 では、JMP 13 には制限があったいくつかの関数を提供しました。最も頻繁に使用する 2 つは (1) LCombine()オブジェクトまたは行列のリストの和集合または共通部分を見つけます。 リストには文字列、式などを含めることができます。(2) LFunc()これにより、ユーザーはリスト内の各要素に適用される関数 (Contains() など) を定義できるため、for ループのスクリプトを作成する必要がありません。
Re: 行列の共通要素と非共通要素の関数@gzmorgan0 、
ご返答ありがとうございます。 あなたのアドバイスを試してみましたが、私の見解は次のとおりです。
Clear Log(); Clear Globals();
A = Random Index(10,6);
Show(A);
B = Random Index(10,6);
Show(B);
show(loc(A==B));
show(loc(A!=B));
実行結果:

共通の要素は 2、4、7 および 9 です。 ただし、上記は要素がそれぞれの位置で同じである位置のみを返します
珍しい要素は位置 2、3、4、および 5 にありますが、これも 2 つの行列間の珍しい要素ではなく、要素が同じではない位置にすぎません。
Re: 行列の共通要素と非共通要素の関数を調査する必要がありますloc()行列の関数。 「一般的」ではない値を見つけたい場合は、 loc( A != B ) または loc( Abs(AB) >0 ) を使用します。
上も見てくださいデータテーブルの比較
A = Random Index(10,6);
Show(A);
B = Random Index(10,6);
Show(B);
show(loc(A==B));
//Repeat 10 times
For (i=1, i<=10, i++,
X = J(5,3,RandomInteger(1,10));
Y = J(5,3,RandomInteger(1,10));
show(X, Y, Loc( X-Y ==0), Loc(X==Y));
);
//Note be careful if the values are "floating" numbers 5 might be stored as 5.000000001 or 4.999999999
//you might want to use Loc( Abs(X-Y) < 1e-32) some "fuzz factor"