Funzioni di libreria integrate più potenti per le matriciFunzione 1 : Capacità di trovare elementi comuni e non comuni tra matrici
Non sono a conoscenza di una funzione incorporata in grado di determinare gli elementi comuni e non comuni tra due o più matrici quando hanno un numero di elementi non pari. L'unico modo che conosco per ottenere questo risultato in JSL è il seguente, oltre a gettare effettivamente i dati nelle tabelle dati.
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);
L'approccio dimostrato @gzmorgan0 di seguito si applica solo alle matrici con lo stesso numero di elementi
Funzione 2 : Capacità di ordinare una matrice mantenendo la posizione degli elementi ( https://community.jmp.com/t5/Discussions/Sort-a-matrix/mp/85678#M38246 )
Automazione e scriptingRi: Funzioni di libreria incorporate più potenti per Matrici@gzmorgan0 Mi piace molto questa funzione LFunc.
Ri: Funzioni di libreria incorporate più potenti per Matrici@uday_guntupalli Penso che il tuo suggerimento di una funzione IsMember () o Intersect sia buono. Tuttavia, il tuo esempio si riferisce solo a matrici, valori numerici. Questa sarebbe una buona funzione per elenchi di qualsiasi tipo di oggetto.Gli elementi della lista dei desideri di lunga data includono: unione e intersezione di insiemi e la possibilità di applicare funzioni di stringa ed elenco a ciascun elemento in un elenco. Gli script associati per JSL Companion 2a edizione includevano il codice per le funzioni per l'unione e l'intersezione, Like e uno che chiamiamo LFunc. Puoi creare uno script di funzioni personalizzate di uso comune e includerle con il codice Include( "mypath/myfuncs.jsl" ); . Quindi usali nel tuo script. Sarebbe bello avere alcune di queste funzionalità integrate.Di seguito una descrizione di LFunz E Come e ei risultati dell'utilizzo di tali funzioni sul tuo esempio.Lo script che definisce queste due funzioni con ampi commenti ed esempi è denominato JSLC_CustomListFunctions.jsl Per quanto riguarda la tua richiesta di posizioni originali, per una matrice ordinata per colonne una semplice modifica dell'ordinamento di Ian e l'uso della funzione Rank () dovrebbe darti quello che vuoi oggi.
Le funzioni qui definite sono:
- LFunc( mialista, espr); dove expression è come expr(Substr(x,1,1)).
- Like(SourceStr,SearchStr); entrambi gli argomenti sono testo/stringhe. Il secondo argomento utilizza % e * come caratteri jolly. Nota questo un Regex semplificato.
LFunc può risparmiare la scrittura di cicli for, Like può salvare la ricerca della sintassi 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
//------------------------------------------------------------------------------
Ri: Funzioni di libreria incorporate più potenti per MatriciIn R, lo stesso si ottiene da:

In Matlab, ciò si ottiene:

Re: Funzione per elementi comuni ed elementi non comuni nelle matrici@gzmorgan0 ,
Grazie. Anche un aggiornamento alla nostra conversazione precedente, non penso che l'approccio che consigli funzionerebbe se le matrici avessero un numero di righe o un numero di colonne diverso a seconda che si tratti di un vettore di riga o di un vettore di colonna, vero?
Re: Funzione per elementi comuni ed elementi non comuni nelle matriciJSL C ompanion, Applicazioni del linguaggio di scripting JMP, 2a edizione.
Re: Funzione per elementi comuni ed elementi non comuni nelle matrici@gzmorgan0 ,
Cosa significa JSLC?
Re: Funzione per elementi comuni ed elementi non comuni nelle matriciIl tuo post originale diceva " Non sono a conoscenza di una funzione integrata in grado di determinare gli elementi comuni e non comuni tra due o più matrici. "
Ogni elemento in una matrice consiste di un valore e di una posizione. Quindi, ho usato il loc() funzione per trovare comuni e non comuni elementi .Il tuo post sarebbe stato più preciso se avessi richiesto comune e non comune valori .
Nota, nel caso tu sia interessato, puoi utilizzare gli indici per ottenere valori comuni e non comuni, nonché matrici abbinate e matrici non abbinate.
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);
Tuttavia, le matrici sono numeriche.Per JSLC v2, abbiamo fornito diverse funzioni in cui JMP 13 presentava limitazioni: Le due che utilizziamo più spesso sono (1) LCombina() che trova l'unione o l'intersezione di liste di oggetti o matrici. Le liste possono contenere stringhe, espressioni, ecc. (2) LFunc() che consente a un usr di definire una funzione che viene applicata a ciascun elemento nell'elenco, ad esempio, Contains() in modo che l'utente non sia tenuto a scrivere un ciclo for.
Oggetto: Funzione per elementi comuni ed elementi non comuni nelle matrici@gzmorgan0 ,
Grazie per la vostra risposta. Ho provato il tuo consiglio ed ecco la mia opinione:
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));
Risultati della corsa:

Gli elementi comuni sono 2,4,7 e 9 . Tuttavia quanto sopra restituisce solo le posizioni in cui gli elementi sono gli stessi nelle rispettive posizioni
Gli elementi non comuni si trovano nelle posizioni 2,3,4 e 5 che ancora una volta non sono gli elementi non comuni tra le due matrici ma solo le posizioni in cui gli elementi non sono uguali.
Oggetto: Funzione per elementi comuni ed elementi non comuni nelle matriciDovresti indagare sul loc() funzione per matrici. Se vuoi trovare valori non "comuni" usa loc( A != B ) o loc( Abs(AB) >0 );
Guarda anche in alto Confronta tabelle dati
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"