La forma más rápida de obtener elementos distintos de una matriz / listaEstoy tratando de obtener los distintos elementos en un vector bastante grande y me preguntaba si alguien sabía de una manera más rápida que hacer una matriz asociativa. Intenté lo siguiente.
Names Default to here(1);
dt = open("$SAMPLE_DATA\Probe.jmp");
rows = dt << Get rows Where(Num(:Wafer Number) <= 10);
times = Column(dt, "Start Time")[rows];
//option 1
st = HPTime();
distinct1 = associative array(as list(times));
distinct1 = distinct1 << Get Keys;
opt1 = HPTime()-st;
show(opt1);
//option 2
st = HPTime();
dt_sub = dt << Subset(
Selected Rows( 0 ),
Rows( rows ),
Selected columns only( 0 )
);
Summarize(dt_sub, distinct2 = by(:Start Time));
close(dt_sub, no save);
opt2 = HPTime()-st;
show(opt2);
//option 3
st = HPTime();
distinct3 = [];
for(i=1, i<=nrows(times), i++,
if(!any(distinct3 == times[i]),
distinct3 ||= times[i]
)
);
opt3 = HPTime()-st;
show(opt3);
//option 4
st = HPTime();
distinct4 = {};
for(i=1, i<=nrows(times), i++,
if(!Contains(distinct4, times[i]),
insert into(distinct4, times[i])
)
);
opt4 = HPTime()-st;
show(opt4);
show(nitems(distinct1), nitems(distinct2), nrows(distinct3`), nitems(distinct4));
Lo que dio una salida de:
opt1 = 1082;
opt2 = 40914;
opt3 = 5853;
opt4 = 8001;
N artículos (distinto 1) = 211;
N artículos (distinto 2) = 211;
Filas N (distintas 3) = 211;
N artículos (distinto 4) = 211;
* Editar * De acuerdo, definitivamente NO use una matriz asociativa porque no permite las claves de punto flotante, redondea todo. El bucle for parece bastante lento para esta operación, ¿así que alguien tiene algo mejor?
Re: la forma más rápida de obtener elementos distintos de una matriz / listaNo estoy seguro de cómo se compara en velocidad, pero es más rápido de escribir ...
distinct = Design(times, <<LEVELS></LEVELS>
Re: la forma más rápida de obtener elementos distintos de una matriz / listaPara la mayoría de mis sets he probado. La escala de 2 ^ 52 parece ser la más rápida (con una pérdida aceptable). Gracias por todos los comentarios.
Re: la forma más rápida de obtener elementos distintos de una matriz / listaBuen uso del resumen.
La mejor solución puede ser diferente para diferentes problemas de tamaño; una gran sobrecarga de configuración puede pagar por un problema suficientemente grande.
Estaba investigando cómo convertir los números de punto flotante en claves para matrices asociativas y solo se me ocurrieron respuestas más lentas que involucran cadenas hechas a partir de los números.
Puede escalar los números de punto flotante en números enteros entre +/- 2 ^ 52 y usar los números enteros para indexar matrices asociativas. Sí, 2 ^ 52 no 2 ^ 32 y no 2 ^ 64. Los números de punto flotante de precisión previa de 8 bytes que utiliza JMP tienen una fracción de 52 bits wikipedia . Esto sería una conversión con pérdida, pero podría mantener la mayor parte de la información.
Re: la forma más rápida de obtener elementos distintos de una matriz / listaAquí hay otra alternativa que quizás quieras probar.
Names Default To Here( 1 );
dt = Open( "$SAMPLE_DATA\Probe.jmp" );
dt << Select Where( Num( :Wafer Number ) > 10 );
dt << exclude;
dtSumm = dt << Summary(
private,
Group( :Start Time ),
Freq( "None" ),
Weight( "None" ),
statistics column name format( "column" ),
Link to original data table( 0 )
);
dtSumm << delete rows;
Distinct = dtSumm:Start Time << get values;
Close( dtSumm, nosave );
dt << clear row states;
Re: la forma más rápida de obtener elementos distintos de una matriz / listaHice lo mismo usando una matriz asociativa. Como debe observar, para manejar números menores a cero / con muchos decimales, primero debe tomar una muestra de los datos, averiguar cuál sería un buen factor de escala y luego escalar los elementos del vector.
Eso parece funcionar aún más rápido que usar un bucle for, ya que es un poco de manipulación matricial seguida de la creación de la matriz asociativa.