¿Qué consejos generales tienes para jugar al golf en MATLAB? Estoy buscando ideas que se puedan aplicar a los problemas de golf de código en general que sean al menos algo específicos de MATLAB (por ejemplo, "eliminar comentarios" no es una respuesta). Por favor, publique un consejo por respuesta.
14
Respuestas:
Algo que uno debe saber antes de comenzar a jugar golf:
En los cálculos de MATLAB, un personaje se comporta igual que su código ascii.
fuente
Acortar nombres de propiedad
En MATLAB, las cadenas que identifican propiedades pueden acortarse siempre que no genere ambigüedad.
Esto realmente me ganó un desafío :)
fuente
name, value
pares como se muestra arriba. (Así que no a cosas comosort(rand(4,1),'descend')
)conv(1:5,[1 1],'s')
lugar deconv(1:5,[1 1],'same')
El casting como char se puede hacer mediante concatenación con un char:
Aunque solo ahorra un carácter, esto se puede usar con bastante frecuencia.
fuente
Las cadenas son solo vectores de fila de caracteres. Esto significa que en lugar de
simplemente puedes escribir
La primera vez que usé esto: /codegolf//a/58387/32352
fuente
Raíces de la unidad a través de la transformada discreta de Fourier
Dado un número entero positivo
n
, la forma estándar para generar losn
-ésimos raíces de la unidad esEsto le da a las raíces que comienzan
1
y se mueven en la dirección angular positiva. Si el orden no importa, esto se puede acortar aComo
exp(2j*pi/4)
es igual a la unidad imaginaria (j
), esto se puede escribir de manera más compacta de la siguiente manera (truco debido a @flawr ):o
Pero la transformada discreta de Fourier proporciona una forma aún más corta (gracias a @flawr por eliminar dos paréntesis innecesarios):
que da las raíces comenzando
1
y moviéndose en la dirección angular positiva; oque comienza en
1
y se mueve en la dirección angular negativa.Pruebe todo lo anterior aquí .
fuente
fft(1:n==2)
nnz
a veces puede ahorrarle unos pocos bytes:A
. En lugar desum(sum(A))
osum(A(:))
, puede usarnnz(a)
(sennz
aplica implícitamente(:)
).numel(x)
usarlosnnz(x)
. Esto es aplicable por ejemplo six
es una cadena.fuente
Iteración sobre vectores en matrices.
Dado un conjunto de vectores como matriz, en realidad puede iterar sobre ellos a través de un solo bucle for como
mientras que "tradicionalmente" probablemente lo hubieras hecho como
Acabo de enterarme de este truco por @Suever en este desafío .
fuente
Consejos relacionados, pero no idénticos para Octave .
Una característica poco conocida y poco utilizada tanto de MATLAB como de Octave es que la mayoría de las funciones incorporadas se pueden llamar sin paréntesis, en cuyo caso tratarán lo que sigue como una cadena (siempre que no contenga espacios). Si contiene espacios, necesita comillas. Esto se puede usar con frecuencia para guardar un byte cuando se usa
disp
:Otros ejemplos menos útiles incluyen:
De hecho, he usado esto dos veces en "¿Qué tan alto puedes contar?" -desafío:
es equivalente a
strchr('sssssssssssssst','t')
y vuelve15
.es equivalente a
nnz('nnnnnnnnnnnnnn')
y vuelve14
.Cosas como
gt r s
obras también (equivalente a'r'>'s'
ogt('r','s')
.fuente
Los integrados
ones
yzeros
son un desperdicio de espacio típico. Puede lograr el mismo resultado simplemente multiplicando una matriz / matriz (del tamaño deseado) por 0 (para obtener la salida dezeros
) y agregue 1 si desea la salida deones
.Esto también funciona si desea crear un vector de columna o fila de ceros o unos del tamaño de una dimensión de una matriz.
Si desea crear una matriz de un tamaño específico que podría usar,
zeros
pero también podría asignar el último elemento a 0 y hacer que MATLAB complete el resto.fuente
~(1:n)
para vectores cero 1-d.Núcleos de convolución 2D
Este es quizás un tema de nicho, pero aparentemente a algunas personas les gusta usar la convolución para varias cosas aquí. [cita requerida]
En 2D, a menudo se necesitan los siguientes núcleos:
Esto se puede lograr usando
que es más corto que
Otro núcleo de uso frecuente es
que se puede acortar usando
fuente
toeplitz([0 1 0])
A menudo me encuentro usando
meshgrid
ondgrid
, digamos que queremos calcular una imagen de mandelbrot, luego inicializamos, por ejemploAhora, para el conjunto de Mandelbrot necesitamos otra matriz
c
de la magnitud dex
yy
pero inicializa con ceros. Esto se puede hacer fácilmente escribiendo:También puede inicializarlo a otro valor:
Pero en realidad puede guardar algunos bytes simplemente agregando otra dimensión en
meshgrid/ndgrid
:Y puede hacer esto con la frecuencia que desee:
fuente
x=-2:1d-2:1;y=x'
.Suma de una secuencia de funciones
Para resumir las funciones f (x_n) donde n es un vector de enteros consecutivos, se aconseja feval en lugar de symsum.
Observe que una operación elemental
.*
y./
es necesaria en lugar de operaciones binarias por pares*
y/
Si la función puede escribirse ingenuamente, nadie de las dos últimas formas es adecuado.
por ejemplo, si la función es
log
simplemente puede hacer:,sum(log(1:n))
que representa:para funciones relativamente sofisticadas como
log(n)/x^n
puedes hacer:e incluso más corto en algunos casos cuando una función es más larga como
f(x)=e^x+sin(x)*log(x)/x
...eso es notablemente más corto que
sum(feval(@(y)e.^(1:n)+sin(1:n).*log(1:n)./(1:n),1:n))
Nota: Este truco se puede aplicar para otros operadores inclusivos como
prod
omean
fuente