arrays - que - ¿Cuál es la ventaja del linspace sobre el operador ":" de dos puntos?
operador dos puntos python (3)
¿Hay alguna ventaja de escribir
t = linspace(0,20,21)
terminado
t = 0:1:20
?
Entiendo que lo primero produce un vector, como lo hace el primero.
¿Alguien me puede indicar alguna situación en la que el linspace
sea útil sobre t = 0:1:20
?
No es solo la usabilidad. Aunque la documentación dice:
La función
linspace
genera vectores espaciados linealmente. Es similar al operador de dos puntos:, pero da control directo sobre el número de puntos.
es la misma, la principal diferencia y ventaja de linspace
es que genera un vector de enteros con la longitud deseada (o por defecto 100) y luego la escala al rango deseado. El :
dos puntos crea el vector directamente por incrementos.
Imagina que necesitas definir los bordes de un contenedor para un histograma. Y, especialmente, necesita que el borde de la bandeja de seguridad 0.35
esté exactamente en el lugar correcto:
edges = [0.05:0.10:.55];
X = edges == 0.35
edges = 0.0500 0.1500 0.2500 0.3500 0.4500 0.5500
X = 0 0 0 0 0 0
no define el borde derecho del contenedor, pero:
edges = linspace(0.05,0.55,6); %// 6 = (0.55-0.05)/0.1+1
X = edges == 0.35
edges = 0.0500 0.1500 0.2500 0.3500 0.4500 0.5500
X = 0 0 0 1 0 0
hace.
Bueno, es básicamente un tema de punto flotante. Lo que se puede evitar con el linspace
, ya que una sola división de un entero no es tan delicada, como la suma acumulativa de los números de punto de flotación. Pero como Mark Dickinson señaló en los comentarios: No debe confiar en que ninguno de los valores calculados sea exactamente lo que espera. Para eso no es el linspace. En mi opinión, es una cuestión de la probabilidad de que tenga problemas de punto flotante y de cuánto puede reducir la probabilidad para ellos o de cuán pequeña puede establecer las tolerancias. El uso de linspace puede reducir la probabilidad de que ocurran estos problemas, no es una seguridad.
Ese es el código de linspace
:
n1 = n-1
c = (d2 - d1).*(n1-1) % opposite signs may cause overflow
if isinf(c)
y = d1 + (d2/n1).*(0:n1) - (d1/n1).*(0:n1)
else
y = d1 + (0:n1).*(d2 - d1)/n1
end
En resumen: linspace
y dos puntos son confiables para hacer diferentes tareas. linspace
intenta asegurar (como su nombre indica) el espaciado lineal, mientras que los colon
intentan asegurar la simetría
En su caso especial, al crear un vector de números enteros, no hay ninguna ventaja de linspace
(aparte de la usability de usability ), pero cuando se trata de tareas delicadas de punto flotante, puede haber.
La respuesta de Sam Roberts proporciona información adicional y aclara más cosas, incluidas algunas declaraciones de MathWorks con respecto al operador de colon .
linspace
es útil cuando conoce la cantidad de elementos que desea en lugar del tamaño del "paso" entre ellos. Por lo tanto, si dije un vector con 360 elementos entre 0
y 2*pi
como un ejemplo artificial, o bien será
linspace(0, 2*pi, 360)
o si acaba de tener el operador de dos puntos, tendría que calcular manualmente el tamaño del paso:
0:(2*pi - 0)/(360-1):2*pi
linspace
es más conveniente
Para una aplicación simple del mundo real, vea esta respuesta donde linspace
es útil para crear un mapa de color personalizado
linspace
y el operador de colon hacen cosas diferentes.
linspace
crea un vector de enteros de la longitud especificada, y luego lo reduce al intervalo especificado con una división. De este modo, garantiza que el vector de salida esté lo más espaciado linealmente posible.
El operador de dos puntos agrega incrementos al punto de inicio, y resta disminuciones del punto final para llegar a un punto medio. De esta manera, garantiza que el vector de salida sea lo más simétrico posible.
Los dos métodos tienen objetivos diferentes y, a menudo, darán respuestas ligeramente diferentes, por ejemplo,
>> a = 0:pi/1000:10*pi;
>> b = linspace(0,10*pi,10001);
>> all(a==b)
ans =
0
>> max(a-b)
ans =
3.5527e-15
Sin embargo, en la práctica, las diferencias a menudo tendrán poco impacto a menos que esté interesado en pequeños detalles numéricos. Considero que el linspace
más conveniente cuando el número de espacios es fácil de expresar, mientras que el operador de dos puntos es más conveniente cuando el incremento es fácil de expresar.
Consulte esta nota técnica de MathWorks para obtener más detalles sobre el algoritmo detrás del operador de dos puntos. Para obtener más detalles sobre el linspace
, puede escribir edit linspace
para ver exactamente lo que hace.