Fonctions de bibliothèque intégrées plus puissantes pour les matricesFonction 1 : Capacité à trouver des éléments communs et non communs entre des matrices
Je ne connais pas de fonction intégrée capable de déterminer les éléments communs et non communs entre deux ou plusieurs matrices lorsqu'elles ont un nombre impair d'éléments. La seule façon dont je connaisse la possibilité d'y parvenir en JSL est la suivante, sans pour autant placer les données dans des tables de données.
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'approche démontrée par @gzmorgan0 ci-dessous s'applique uniquement aux matrices avec le même nombre d'éléments
Fonction 2 : Possibilité de trier une matrice tout en conservant la position des éléments ( https://community.jmp.com/t5/Discussions/Sort-a-matrix/mp/85678#M38246 )
Automatisation et scriptsRe : Fonctions de bibliothèque intégrées plus puissantes pour les matrices@gzmorgan0 J'aime beaucoup cette fonction LFunc.
Re : Fonctions de bibliothèque intégrées plus puissantes pour les matrices@uday_guntupalli Je pense que votre suggestion de fonction IsMember() ou Intersect est bonne. Cependant, votre exemple ne fait référence qu'aux matrices, aux valeurs numériques. Ce serait une bonne fonction pour les listes de tout type d'objet.Les éléments de liste de souhaits de longue date incluent : l'union et l'intersection d'ensembles, et la possibilité d'appliquer des fonctions de chaîne et de liste à chaque élément d'une liste. Les scripts associés pour JSL Companion 2e édition comprenaient le code des fonctions d'union et d'intersection, Like et celui que nous appelons LFunc. Vous pouvez créer un script de fonctions personnalisées couramment utilisées et les inclure avec le code Include( "mypath/myfuncs.jsl" ); . Ensuite, utilisez-les simplement dans votre script. Ce serait bien d'avoir certaines de ces fonctionnalités intégrées.Ci-dessous une description de LFunc et Comme et et les résultats de l'utilisation de ces fonctions sur votre exemple.Le script qui définit ces deux fonctions avec des commentaires et des exemples détaillés est nommé JSLC_CustomListFunctions.jsl En ce qui concerne votre demande d'emplacements d'origine, pour une colonne de matrices triées, une simple modification du tri de Ian et l'utilisation de la fonction Rank () devraient vous donner ce que vous voulez aujourd'hui.
Les fonctions définies ici sont :
- LFunc( maliste, expr); où expression est comme expr(Substr(x,1,1)).
- Comme(SourceStr,SearchStr); les deux arguments sont du texte/des chaînes. Le deuxième argument utilise % et * comme jokers. Notez qu'il s'agit d'une Regex simplifiée.
LFunc peut économiser l'écriture de boucles for, Like peut économiser la recherche de la syntaxe 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 : Fonctions de bibliothèque intégrées plus puissantes pour les matricesDans R, la même chose est obtenue par :

Dans Matlab, ceci est réalisé par :

Re : Fonction pour les éléments communs et les éléments inhabituels dans les matrices@gzmorgan0 ,
Merci. Aussi une mise à jour de notre conversation précédente, je ne pense pas que l'approche que vous recommandez fonctionnerait si les matrices avaient différents # de lignes ou # de colonnes selon qu'il s'agit d'un vecteur ligne ou d'un vecteur colonne, n'est-ce pas ?
Re : Fonction pour les éléments communs et les éléments inhabituels dans les matricesJSL C ompanion, Applications du langage de script JMP, 2e édition.
Re : Fonction pour les éléments communs et les éléments inhabituels dans les matrices@gzmorgan0 ,
Que signifie JSLC ?
Re : Fonction pour les éléments communs et les éléments inhabituels dans les matricesVotre message d'origine indiquait " Je ne connais pas de fonction intégrée capable de déterminer les éléments communs et inhabituels entre deux matrices ou plus. "
Chaque élément dans une matrice se compose d'une valeur et d'une position. Du coup, j'ai utilisé le loc() fonction pour trouver commun et peu commun éléments .Votre message aurait été plus précis si vous aviez demandé commun et peu commun valeurs .
Notez que si vous êtes intéressé, vous pouvez utiliser les indices pour obtenir des valeurs communes et inhabituelles ainsi que des matrices appariées et des matrices non appariées.
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);
Cependant, les matrices sont numériques.Pour JSLC v2, nous avons fourni plusieurs fonctions là où JMP 13 avait des limitations : Les deux que nous utilisons le plus souvent sont (1) LCombiner() qui trouve l'union ou l'intersection de listes d'objets ou de matrices. Les listes peuvent contenir des chaînes, des expressions, etc. (2) LFunc() qui permet à un utilisateur de définir une fonction qui est appliquée à chaque élément de la liste, par exemple, Contient() afin que l'utilisateur n'ait pas besoin de scripter une boucle for.
Re : Fonction pour les éléments communs et les éléments inhabituels dans les matrices@gzmorgan0 ,
Merci pour votre réponse. J'ai essayé vos conseils et voici mon avis :
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));
Résultats de l'exécution :

Les éléments communs sont 2,4,7 et 9 . Cependant, ce qui précède ne renvoie que les positions où les éléments sont les mêmes dans les positions respectives
Les éléments peu communs sont dans les positions 2, 3, 4 et 5 qui, encore une fois, ne sont pas les éléments peu communs entre les deux matrices mais juste les positions où les éléments ne sont pas les mêmes.
Re : Fonction pour les éléments communs et les éléments inhabituels dans les matricesVous devriez enquêter sur loc() fonction pour les matrices. Si vous voulez trouver des valeurs non "communes", utilisez loc( A != B ) ou loc( Abs(AB) >0 );
Regarde aussi Comparer les tableaux de données
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"