Quels conseils généraux avez-vous pour jouer au golf dans MATLAB? Je cherche des idées qui peuvent être appliquées aux problèmes de golf de code en général qui sont au moins quelque peu spécifiques à MATLAB (par exemple, "supprimer les commentaires" n'est pas une réponse). Veuillez poster un pourboire par réponse.
14
Réponses:
Quelque chose que l'on doit savoir avant de commencer à jouer au golf:
Dans les calculs MATLAB, un caractère se comporte de la même manière que son code ascii.
la source
Raccourcir les noms de propriété
Dans MATLAB, les chaînes identifiant les propriétés peuvent être raccourcies tant qu'elles n'entraînent pas d'ambiguïté.
En fait, m'a en gagné un défi :)
la source
name, value
paires comme indiqué ci-dessus. (Donc pas pour des choses commesort(rand(4,1),'descend')
)conv(1:5,[1 1],'s')
au lieu deconv(1:5,[1 1],'same')
Le cast en tant que caractère peut être effectué par concaténation avec un caractère:
Bien qu'il n'enregistre qu'un seul caractère, cela peut être utilisé assez fréquemment.
la source
Les chaînes ne sont que des vecteurs de lignes de caractères. Cela signifie qu'au lieu de
vous pouvez simplement écrire
La première fois que j'ai utilisé ceci: /codegolf//a/58387/32352
la source
Racines de l'unité via une transformée de Fourier discrète
Étant donné un entier positif
n
, la façon standard de générer les racinesn
-th de l'unité estCela permet aux racines de commencer
1
et de se déplacer dans la direction angulaire positive. Si la commande n'a pas d'importance, cela peut être raccourciComme
exp(2j*pi/4)
est égal à l'unité imaginaire (j
), cela peut être écrit de manière plus compacte comme suit (astuce due à @flawr ):ou
Mais la transformée de Fourier discrète offre un moyen encore plus court (grâce à @flawr pour avoir supprimé deux parenthèses inutiles):
ce qui donne les racines commençant
1
et se déplaçant dans la direction angulaire positive; ouqui commence à
1
et se déplace dans la direction angulaire négative.Essayez tout ce qui précède ici .
la source
fft(1:n==2)
nnz
peut parfois vous faire économiser quelques octets:A
. Au lieu desum(sum(A))
ousum(A(:))
, vous pouvez utilisernnz(a)
(nnz
s'applique implicitement(:)
).numel(x)
vous pouvez utilisernnz(x)
. Cela s'applique par exemple six
est une chaîne.la source
Itération sur des vecteurs dans des matrices.
Étant donné un ensemble de vecteurs comme matrice, vous pouvez réellement les parcourir via une seule boucle for comme
alors que "traditionnellement" vous l'auriez probablement fait comme
Je viens d'apprendre cette astuce à l'instant de @Suever dans ce défi .
la source
Conseils liés mais pas identiques pour Octave .
Une caractéristique peu connue et peu utilisée de MATLAB et d'Octave est que la plupart des fonctions intégrées peuvent être appelées sans parenthèses, auquel cas elles traiteront tout ce qui la suit comme une chaîne (tant qu'elle ne contient pas d'espaces). S'il contient des espaces, vous avez besoin de guillemets. Cela peut fréquemment être utilisé pour enregistrer un octet lors de l'utilisation
disp
:Voici d'autres exemples moins utiles:
J'ai en fait utilisé cela deux fois dans le "Combien pouvez-vous compter?" -défi:
est équivalent à
strchr('sssssssssssssst','t')
et renvoie15
.est équivalent à
nnz('nnnnnnnnnnnnnn')
et renvoie14
.Des trucs comme des
gt r s
œuvres aussi (équivalent à'r'>'s'
ougt('r','s')
.la source
Le intégré
ones
etzeros
sont généralement une perte d'espace. Vous pouvez obtenir le même résultat en multipliant simplement un tableau / matrice (de la taille souhaitée) par 0 (pour obtenir la sortie dezeros
) et ajoutez 1 si vous voulez la sortie deones
.Cela fonctionne également si vous souhaitez créer un vecteur colonne ou ligne de zéros ou de la taille d'une dimension d'une matrice.
Si vous souhaitez créer une matrice d'une taille spécifique, vous pouvez utiliser
zeros
mais vous pouvez également affecter simplement le dernier élément à 0 et demander à MATLAB de remplir le reste.la source
~(1:n)
pour les vecteurs zéro 1-d.Noyaux de convolution 2D
C'est peut-être un sujet de niche, mais apparemment, certaines personnes aiment utiliser la convolution pour diverses choses ici. [citation requise]
En 2D, les noyaux suivants sont souvent nécessaires:
Ceci peut être réalisé en utilisant
qui est plus court que
Un autre noyau souvent utilisé est
qui peut être raccourci en utilisant
la source
toeplitz([0 1 0])
Je me retrouve assez souvent à utiliser
meshgrid
oundgrid
, disons que nous voulons calculer une image mandelbrot, puis nous initialisons par exempleMaintenant , pour l'ensemble de Mandelbrot nous avons besoin une autre matrice
c
de la taillex
ety
mais initialisées avec des zéros. Cela peut facilement se faire en écrivant:Vous pouvez également l'initialiser sur une autre valeur:
Mais vous pouvez réellement enregistrer quelques octets en ajoutant simplement une autre dimension dans
meshgrid/ndgrid
:Et vous pouvez le faire aussi souvent que vous le souhaitez:
la source
x=-2:1d-2:1;y=x'
.Sommation d'une séquence de fonctions
Pour résumer les fonctions f (x_n) où n est un vecteur d'entiers consécutifs, feval est conseillé plutôt que symsum.
Notez qu'une opération élémentaire
.*
et./
est nécessaire au lieu d'opérations binaires par paires*
et/
Si la fonction peut être écrite naïvement, personne des deux dernières manières ne convient.
par exemple, si la fonction est,
log
vous pouvez simplement faire:, cesum(log(1:n))
qui représente:pour des fonctions relativement sophistiquées comme
log(n)/x^n
vous pouvez le faire:et encore plus court dans certains cas quand une fonction est plus longue que
f(x)=e^x+sin(x)*log(x)/x
....qui est remarquablement plus court que
sum(feval(@(y)e.^(1:n)+sin(1:n).*log(1:n)./(1:n),1:n))
Remarque: cette astuce peut être appliquée pour d'autres opérateurs inclusifs comme
prod
oumean
la source