Stärkere integrierte Bibliotheksfunktionen für MatrizenFunktion 1 : Fähigkeit, gemeinsame und ungewöhnliche Elemente zwischen Matrizen zu finden
Mir ist keine integrierte Funktion bekannt, die die gemeinsamen und nicht gemeinsamen Elemente zwischen zwei oder mehreren Matrizen bestimmen kann, wenn diese eine ungerade Anzahl von Elementen aufweisen. Die einzige mir bekannte Möglichkeit, dies in JSL zu erreichen, ist die folgende, abgesehen davon, die Daten tatsächlich in Datentabellen einzugeben.
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);
Der unten von @gzmorgan0 demonstrierte Ansatz gilt nur für Matrizen mit derselben Anzahl von Elementen
Funktion 2 : Möglichkeit, eine Matrix zu sortieren und dabei die Position der Elemente beizubehalten ( https://community.jmp.com/t5/Discussions/Sort-a-matrix/mp/85678#M38246 )
Automatisierung und SkriptingBetreff: Stärkere integrierte Bibliotheksfunktionen für Matrizen@gzmorgan0 Ich mag diese LFunc-Funktion wirklich.
Betreff: Stärkere integrierte Bibliotheksfunktionen für Matrizen@uday_guntupalli Ich denke, Ihr Vorschlag einer IsMember()-Funktion oder Intersect ist gut. Ihr Beispiel bezieht sich jedoch nur auf Matrizen, numerische Werte. Dies wäre eine gute Funktion für Listen jeglicher Art von Objekten.Zu den langlebigen Wunschlistenelementen gehören: Vereinigung und Schnittmenge von Mengen sowie die Möglichkeit, Zeichenfolgen- und Listenfunktionen auf jedes Element in einer Liste anzuwenden. Die zugehörigen Skripte für JSL Companion 2. Edition enthielten den Code für Funktionen für Vereinigung und Schnittmenge, Like und eine, die wir LFunc nennen. Sie können ein Skript mit häufig verwendeten benutzerdefinierten Funktionen erstellen und diese mit dem Code Include( "mypath/myfuncs.jsl" ); einbinden. . Dann verwenden Sie sie einfach in Ihrem Skript. Es wäre schön, einige dieser Funktionen integriert zu haben.Nachfolgend finden Sie eine Beschreibung von LFunk Und Wie und die Ergebnisse der Verwendung dieser Funktionen in Ihrem Beispiel.Benannt ist das Skript, das diese beiden Funktionen mit ausführlichen Kommentaren und Beispielen definiert JSLC_CustomListFunctions.jsl Bezüglich Ihrer Anfrage nach Originalpositionen: Für eine spaltensortierte Matrize sollte eine einfache Modifikation von Ians Sortierung und die Verwendung der Rank()-Funktion Ihnen heute das geben, was Sie wollen.
Die hier definierten Funktionen sind:
- LFunc( mylist, expr); wobei Ausdruck wie expr(Substr(x,1,1)) ist.
- Like(SourceStr,SearchStr); beide Argumente sind Text/Strings. Das zweite Argument verwendet % und * als Platzhalter. Beachten Sie, dass dies ein vereinfachter Regex ist.
LFunc kann das Schreiben von For-Schleifen ersparen, ebenso wie das Nachschlagen der REGEX-Syntax.
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
//------------------------------------------------------------------------------
Betreff: Stärkere integrierte Bibliotheksfunktionen für MatrizenIn R wird dasselbe erreicht durch:

In Matlab wird dies erreicht durch:

Betreff: Funktion für gemeinsame Elemente und ungewöhnliche Elemente in Matrizen@gzmorgan0 ,
Danke schön. Auch ein Update zu unserem vorherigen Gespräch. Ich glaube nicht, dass der von Ihnen empfohlene Ansatz funktionieren würde, wenn die Matrizen eine unterschiedliche Anzahl von Zeilen oder Spalten hätten, je nachdem, ob es sich um einen Zeilenvektor oder einen Spaltenvektor handelt, oder?
Betreff: Funktion für gemeinsame Elemente und ungewöhnliche Elemente in MatrizenJSL C Begleiter, Anwendungen der JMP-Skriptsprache, 2. Auflage.
Betreff: Funktion für gemeinsame Elemente und ungewöhnliche Elemente in Matrizen@gzmorgan0 ,
Wofür steht JSLC?
Betreff: Funktion für gemeinsame Elemente und ungewöhnliche Elemente in MatrizenIn Ihrem ursprünglichen Beitrag hieß es: „ Mir ist keine eingebaute Funktion bekannt, die die gemeinsamen und ungewöhnlichen Elemente zwischen zwei oder mehr Matrizen bestimmen kann. "
Jede Element in einer Matrix besteht aus einem Wert und einer Position. Daher habe ich das verwendet loc() Funktion, um häufige und ungewöhnliche zu finden Elemente .Ihr Beitrag wäre präziser gewesen, wenn Sie „Common“ und „Uncommon“ abgefragt hätten Werte .
Beachten Sie, dass Sie bei Interesse die Indizes verwenden können, um allgemeine und ungewöhnliche Werte sowie übereinstimmende und nicht übereinstimmende Matrizen zu erhalten.
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);
Matrizen sind jedoch numerisch.Für JSLC v2 haben wir mehrere Funktionen bereitgestellt, bei denen JMP 13 Einschränkungen aufwies: Die beiden, die wir am häufigsten verwenden, sind (1) LCombine() das die Vereinigung oder Schnittmenge von Listen von Objekten oder Matrizen findet. Die Listen können Zeichenfolgen, Ausdrücke usw. enthalten. (2) LFunc() Dadurch kann ein Benutzer eine Funktion definieren, die auf jedes Element in der Liste angewendet wird, beispielsweise „Contains()“, sodass der Benutzer kein Skript für eine for-Schleife erstellen muss.
Betreff: Funktion für gemeinsame Elemente und ungewöhnliche Elemente in Matrizen@gzmorgan0 ,
Danke für Ihre Antwort. Ich habe Ihren Rat ausprobiert und hier ist meine Meinung:
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));
Ergebnisse des Laufs:

Gemeinsame Elemente sind 2,4,7 und 9 . Das Obige gibt jedoch nur die Positionen zurück, an denen die Elemente an den jeweiligen Positionen gleich sind
Ungewöhnliche Elemente befinden sich an den Positionen 2,3,4 und 5, wobei es sich wiederum nicht um die ungewöhnlichen Elemente zwischen den beiden Matrizen handelt, sondern nur um Positionen, an denen Elemente nicht gleich sind.
Betreff: Funktion für gemeinsame Elemente und ungewöhnliche Elemente in MatrizenSie sollten das untersuchen loc() Funktion für Matrizen. Wenn Sie nicht „gemeinsame“ Werte finden möchten, verwenden Sie loc( A != B ) oder loc( Abs(AB) >0 );
Schauen Sie auch nach oben Vergleichen Sie Datentabellen
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"