¿Cuál es la ventaja de linspace sobre el colon “:” operador?

¿Hay alguna ventaja de escribir

t = linspace(0,20,21) 

encima

 t = 0:1:20 

?

Entiendo que el primero produce un vector, como lo hace el primero.
¿Alguien puede indicarme alguna situación en la que linspace sea ​​útil sobre t = 0:1:20 ?

No es solo la usabilidad. Aunque la documentación dice:

La función linspace genera vectores linealmente espaciados. Es similar al operador de dos puntos:, pero da control directo sobre la cantidad de puntos.

es lo mismo, la principal diferencia y ventaja de linspace es que genera un vector de números enteros con la longitud deseada (o por defecto 100) y luego lo escala al rango deseado. El : colon crea el vector directamente por incrementos.

Imagine que necesita definir los bordes del contenedor para un histogtwig. Y especialmente necesita que el cierto borde de contenedor 0.35 esté exactamente en su 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 problema de coma flotante. Lo que se puede evitar con linspace , ya que una sola división de un entero no es tan delicada, como la sum acumulativa de los números de punto de fuga. Pero como señaló Mark Dickinson en los comentarios: no debe confiar en que ninguno de los valores calculados sea exactamente lo que espera. Eso no es para lo que linspace es. En mi opinión, se trata de la probabilidad de que tengas problemas con los puntos flotantes y de cuánto puedes reducir la probabilidad para ellos o qué tan pequeño puedes establecer las tolerancias. Usar linspace puede reducir la probabilidad de ocurrencia de 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 colon son confiables para realizar tareas diferentes. linspace intenta asegurar (como su nombre lo indica) espaciado lineal, mientras que el colon intenta asegurar la simetría

En su caso especial, a medida que crea un vector de enteros, no hay ninguna ventaja de linspace (aparte de la usabilidad ), pero cuando se trata de tareas delicadas de coma flotante, puede existir.

La respuesta de Sam Roberts proporciona información adicional y aclara otras cosas, incluidas algunas declaraciones de MathWorks con respecto al operador de dos puntos .

linspace y el operador de dos puntos hacen cosas diferentes.

linspace crea un vector de enteros de la longitud especificada, y luego lo escala al intervalo especificado con una división. De esta manera, asegura que el vector de salida esté lo más espaciado linealmente posible.

El operador de dos puntos agrega incrementos al punto inicial y resta decrementos del punto final para llegar a un punto medio. De esta manera, asegura que el vector de salida sea lo más simétrico posible.

Por lo tanto, los dos métodos tienen diferentes objectives 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(ab) ans = 3.5527e-15 

En la práctica, sin embargo, las diferencias a menudo tendrán poco impacto a menos que esté interesado en pequeños detalles numéricos. Encuentro linspace más conveniente cuando el número de huecos es fácil de express, mientras que el operador de dos puntos me parece más conveniente cuando el incremento es fácil de express.

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 linspace , puede escribir edit linspace para ver exactamente lo que hace.

linspace es útil cuando sabes la cantidad de elementos que deseas en lugar del tamaño del “paso” entre ellos. Entonces, si dijera hacer un vector con 360 elementos entre 0 y 2*pi como un ejemplo artificial, o bien va a ser

 linspace(0, 2*pi, 360) 

o si solo tiene el operador de dos puntos, debe calcular manualmente el tamaño del paso:

 0:(2*pi - 0)/(360-1):2*pi 

linspace es simplemente más conveniente

Para una aplicación simple en el mundo real, vea esta respuesta donde linspace es útil para crear un mapa de color personalizado