Pregunta ¿Cuál es tu truco de programación de MATLAB / Octave favorito? [cerrado]


Creo que todos estarían de acuerdo en que el lenguaje de MATLAB no es bonito o particularmente consistente. ¡Pero no importa! Todavía tenemos que usarlo para hacer las cosas.

¿Cuáles son tus trucos favoritos para facilitar las cosas? Tengamos una por respuesta para que la gente pueda votar si están de acuerdo. Además, intente ilustrar su respuesta con un ejemplo.


73


origen


Respuestas:


Usando el generador de perfiles integrado para ver dónde están las partes más importantes de mi código:

profile on
% some lines of code
profile off
profile viewer

o simplemente usando el built in tic y toc para obtener tiempos rápidos:

tic;
% some lines of code
toc;

39



Extracción directa de los elementos de una matriz que satisfacen una condición particular, utilizando matrices lógicas:

x = rand(1,50) .* 100;
xpart = x( x > 20 & x < 35);

Ahora xpart contiene solo aquellos elementos de x que se encuentran en el rango especificado.


31



Proporcione acceso rápido a la documentación de otras funciones agregando una línea "VER TAMBIÉN" a los comentarios de ayuda. Primero, debe incluir el nombre de la función en mayúsculas como primera línea de comentario. Haga su comentario habitual en el encabezado, luego, VEA TAMBIÉN una lista separada por comas de otras funciones relacionadas.

function y = transmog(x)
%TRANSMOG Transmogrifies a matrix X using reverse orthogonal eigenvectors
%
% Usage:
%   y = transmog(x)
%
% SEE ALSO
% UNTRANSMOG, TRANSMOG2

Cuando escribe "help transmog" en la línea de comandos, verá todos los comentarios en este encabezado de comentario, con hipervínculos a los encabezados de comentario para las otras funciones enumeradas.


28



Convierta una matriz en un vector usando un solo colon.

x = rand(4,4);
x(:)

23



Vectorizar bucles. Hay muchas maneras de hacerlo, y es entretenido buscar loops en su código y ver cómo se pueden vectorizar. ¡El rendimiento es asombrosamente más rápido con operaciones vectoriales!


22



Funciones anónimas, por algunas razones:

  1. para hacer una función rápida para usos únicos, como 3x ^ 2 + 2x + 7. (Consulte la lista a continuación) Esto es útil para funciones como quad y fminbnd que toman funciones como argumentos. También es conveniente en scripts (archivos .m que no comienzan con un encabezado de función) ya que a diferencia de las funciones verdaderas no puede incluir subfunciones.
  2. para cierres - aunque las funciones anónimas son un poco limitantes ya que no parece haber una manera de tener asignaciones dentro de ellas para mutar el estado.

.

% quick functions
f = @(x) 3*x.^2 + 2*x + 7;
t = (0:0.001:1);
plot(t,f(t),t,f(2*t),t,f(3*t));

% closures (linfunc below is a function that returns a function,
% and the outer functions arguments are held for the lifetime
% of the returned function.
linfunc = @(m,b) @(x) m*x+b;
C2F = linfunc(9/5, 32);
F2C = linfunc(5/9, -32*5/9);

20



Matlab bsxfun, arrayfun, cellfuny structfun son bastante interesantes y a menudo guardan un bucle.

M = rand(1000, 1000);
v = rand(1000,    1);
c = bsxfun(@plus, M, v);

Este código, por ejemplo, agrega column-vector v a cada columna de la matriz M.

Sin embargo, en las partes críticas del rendimiento de su aplicación, debe comparar estas funciones con el for-loop trivial porque a menudo los bucles son aún más rápidos.


19



Modo LaTeX para fórmulas en gráficos: En una de las versiones recientes (R2006?) Agrega los argumentos adicionales ,'Interpreter','latex' al final de una llamada a función y utilizará la representación LaTeX. Aquí hay un ejemplo:

t=(0:0.001:1);
plot(t,sin(2*pi*[t ; t+0.25]));
xlabel('t'); 
ylabel('$\hat{y}_k=sin 2\pi (t+{k \over 4})$','Interpreter','latex');
legend({'$\hat{y}_0$','$\hat{y}_1$'},'Interpreter','latex');

No estoy seguro de cuándo lo agregaron, pero funciona con R2006b en las funciones text (), title (), xlabel (), ylabel (), zlabel () e incluso legend (). Solo asegúrese de que la sintaxis que está utilizando no sea ambigua (por lo que con legend () debe especificar las cadenas como una matriz de celdas).


18