Funciones de biblioteca integradas más potentes para matricesFunción 1 : Capacidad de encontrar elementos comunes y no comunes entre matrices.
No conozco ninguna función incorporada que sea capaz de determinar los elementos comunes y no comunes entre dos o más matrices cuando tienen una cantidad de elementos impar. La única forma que conozco de lograr esto en JSL es la siguiente, además de arrojar los datos a las tablas de datos.
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);
El enfoque demostrado por @gzmorgan0 a continuación se aplica solo a matrices con la misma cantidad de elementos.
Función 2 : Capacidad de ordenar una matriz conservando la posición de los elementos ( https://community.jmp.com/t5/Discussions/Sort-a-matrix/mp/85678#M38246 )
Automatización y scriptingRe: Funciones de biblioteca incorporadas más fuertes para Matrices@gzmorgan0 Me gusta mucho esta función LFunc.
Re: Funciones de biblioteca incorporadas más fuertes para Matrices@uday_guntupalli Creo que su sugerencia de una función IsMember() o Intersect es buena. Sin embargo, su ejemplo solo se refiere a matrices, valores numéricos. Esta sería una buena función para listas de cualquier tipo de objeto.Los elementos de la lista de deseos desde hace mucho tiempo incluyen: unión e intersección de conjuntos, y la capacidad de aplicar funciones de cadena y lista a cada elemento de una lista. Los scripts asociados para JSL Companion 2nd edition incluían el código para las funciones de unión e intersección, Like y uno que llamamos LFunc. Puede crear un script de funciones personalizadas de uso común e incluirlas con el código Incluir ("mypath/myfuncs.jsl"); . Entonces simplemente úsalos en tu script. Sería bueno tener algunas de estas características integradas.A continuación se muestra una descripción de LFunc y Como y y los resultados de usar esas funciones en su ejemplo.El script que define estas dos funciones con extensos comentarios y ejemplos se llama JSLC_CustomListFunctions.jsl Con respecto a su solicitud de ubicaciones originales, para una columna de matrices ordenadas, una simple modificación de la clasificación de Ian y el uso de la función Rank() debería darle lo que quiere hoy.
Las funciones aquí definidas son:
- LFunc( milista, expr); donde expresión es como expr(Substr(x,1,1)).
- Me gusta (SourceStr, SearchStr); ambos argumentos son texto/cadenas. El segundo argumento usa % y * como comodines. Tenga en cuenta que esto es una expresión regular simplificada.
LFunc puede evitar escribir bucles for, Like puede evitar buscar la sintaxis 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}
FUNCIÓN
//------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: Funciones de biblioteca incorporadas más fuertes para MatricesEn R, lo mismo se logra mediante:

En Matlab, esto se logra mediante:

Re: Función para elementos comunes y elementos no comunes en Matrices@gzmorgan0 ,
Gracias. También una actualización de nuestra conversación anterior, no creo que el enfoque que recomienda funcione si las matrices tuvieran un número diferente de filas o de columnas dependiendo de si es un vector de fila o un vector de columna, ¿o sí?
Re: Función para elementos comunes y elementos no comunes en MatricesJSL C Companion, Aplicaciones del lenguaje de secuencias de comandos JMP, 2.ª edición.
Re: Función para elementos comunes y elementos no comunes en Matrices@gzmorgan0 ,
¿Qué significa JSLC?
Re: Función para elementos comunes y elementos no comunes en MatricesSu publicación original decía " No tengo conocimiento de una función incorporada que sea capaz de determinar los elementos comunes y no comunes entre dos o más matrices. "
Cada elemento en una matriz consta de un valor y una posición. Por lo tanto, usé el ubicación() función para encontrar común y poco común elementos .Tu publicación habría sido más precisa si hubieras solicitado común y poco común valores .
Tenga en cuenta que, en caso de que esté interesado, puede usar los índices para obtener valores comunes y poco comunes, así como matrices coincidentes y matrices no coincidentes.
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);
Sin embargo, las matrices son numéricas.Para JSLC v2, proporcionamos varias funciones donde JMP 13 tenía limitaciones: las dos que usamos con más frecuencia son (1) LCombinar() que encuentra la unión o intersección de listas de objetos o matrices. Las listas pueden contener cadenas, expresiones, etc. (2) LFunc() que permite a un usuario definir una función que se aplica a cada elemento de la lista, por ejemplo, Contiene () para que el usuario no tenga que escribir un bucle for.
Re: Función para elementos comunes y elementos no comunes en Matrices@gzmorgan0 ,
Gracias por su respuesta. Probé tu consejo y aquí está mi opinión:
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));
Resultados de la carrera:

Los elementos comunes son 2,4,7 y 9 . Sin embargo, lo anterior devuelve solo las posiciones donde los elementos son los mismos en las posiciones respectivas
Los elementos poco comunes están en las posiciones 2, 3, 4 y 5, que nuevamente no son los elementos poco comunes entre las dos matrices, sino solo posiciones donde los elementos no son iguales.
Re: Función para elementos comunes y elementos no comunes en MatricesDeberías investigar el ubicación() función para matrices. Si desea encontrar valores no "comunes", use loc( A != B ) o loc( Abs(AB) >0 );
también mira hacia arriba Comparar tablas de datos
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"