Quels conseils avez-vous pour jouer au golf à Octave? Je recherche 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 à Octave (par exemple, "supprimer les commentaires" n'est pas une réponse). Veuillez poster un pourboire par réponse.
18
Réponses:
a
ne contient aucune valeur nulle, en utilisant desnnz(a)
pièces de rechange de 2 caractères par rapport ànumel(a)
.a(a==0)
àa(find(a==0))
.~t
est plus court quet==0
, et même~~t
est plus court quet!=0
.0*(1:n)
est plus court quezeros(1,n)
||
et&&
, contrairement à de nombreux autres opérateurs, scalarisez le résultat lorsque le premier argument est un scalaire. Pour les matrices, seules les matrices non vides sans éléments égaux à zéro ont la valeur logique true .Par conséquent, nous pouvons faire à la
0||m
place deall(all(m))
n'importe quelle matrice.Essayez avec
0||[1 1;1 0]
et0||[1 1;1 1]
pour vous convaincre.Lorsque vous utilisez un module intégré plusieurs fois, effectuez une gestion de fonction pour épargner des caractères, par exemple.
f=@find
. Pour les noms de fonction courts, au moins 3 occurrences justifient cela, pour les longues - même avec deux occurrences.Lorsqu'une fonction est une instruction unique, préférez la
f=@(n)dosomething(n)
notation àfunction r=f(n)r=dosomething(n);end
une.Malheureusement, les variables globales doivent être déclarées à la fois dans la portée globale et dans chaque fonction qui les utilise. Mais il y a une exception: les
@(n)...
fonctions anonymes "voient" toutes les variables de la portée d'où elles sont appelées.Il est possible de faire à la
f(a=0,b=0)
place dea=0;b=0;f(a,b)
.Cette fonctionnalité semble non documentée, mais l'ordre d'évaluation est de gauche à droite (vérifié à la v. 3.8.1), vous pouvez
zeros(a=n,b=a*a)
à la fois créer la matrice anxn ^ 2 et stocker son numéro de ligne et de colonne dansa
et lesb
variables.La table de priorité des opérateurs est votre ami. Ne faites pas
b=(a==0)
puisqueb=a==0
c'est pareil.la source
Je ne me souviens pas dans quel défi je l'ai vu quelqu'un utiliser (veuillez nous dire =), mais j'ai trouvé que c'était une astuce intéressante:
Habituellement, si vous ajoutez des matrices, vous devez avoir la même taille, mais pour les matrices unidimensionnelles (1xn et nx1), il existe un raccourci (qui ne fonctionne pas dans Matlab):
produit le même effet que
Puis quelque chose que pawel.boczarski a déjà mentionné: Dans Octave, vous pouvez (alors que vous ne pouvez pas dans Matlab) définir des variables auxiliaires dans les poignées de fonction, ET une affectation de variable elle-même a la valeur de l'affectation afin que vous puissiez vraiment raccourcir le code (eh bien c'est inutile exemple mais vous aurez l'astuce):
Ensuite, une autre astuce (également applicable dans Matlab) consiste à abuser des chaînes pour stocker des numéros (codés en dur) (cette astuce est volée à feersum) , vous avez juste besoin de quelque chose qui interprète la chaîne comme un nombre, ce qui est aussi facile que par exemple en ajoutant zéro:
Ou
la source
a+0
, nona+'0'
. A part ça, les conseils sont sympas =)+= -= /=
opérateurs etc dans votre liste ci-dessous?+a
est plus court quea+0
Utilisation de la liste d'arguments:
Octave est capable d'obtenir des arguments par défaut afin que les expressions puissent être évaluées dans la liste des arguments.
Cette fonctionnalité est utile lorsque nous voulons calculer une expression et l'utiliser plusieurs fois:
Un cas d'utilisation est lorsque nous utilisons une affectation indexée pour modifier une partie d'un tableau et que nous voulons utiliser le tableau:
Mais l'expression
(a(2)=5)
renvoiea(2)
ou l'expression(a([1 3])=4)
renvoie un tableau à deux éléments. Aucun ne renvoie la totalité du tableau. Nous pouvons utiliser la liste d'arguments:Ici, le résultat de l'affectation indexée est stocké dans une variable fictive
b
et la fonction renvoie le tableau.la source
-En Octave, il est possible d'appliquer l'indexation sur une expression temporaire, une fonctionnalité interdite dans MATLAB et cette fonctionnalité est très utile pour le golf. exemple:
Octave:
[1 23 4 5 7](3:4)
et son équivalent MATLAB:a=[1 23 4 5 7];a(3:4)
Octave:
hilb(4)(4:5,4:5)
et son équivalent MATLAB:h=hilb(4);h(4:5,4:5)
Octave:
{1,4,{4 5 6},[7 ;3]}{3}
et son équivalent MATLAB:a={1,4,{4 5 6},[7 ;3]};a{3}
Octave:
num2cell([1 2 3 4]){:}
pour la création d'une liste séparée par des virgulesOctave:
a'(:)'
-Parfois dans une fonction anonyme comme une fonction normale, nous avons besoin d'évaluer plusieurs expressions, qui incluent l'affectation, Une approche est que nous pouvons placer chaque expression dans une cellule (car la cellule peut contenir un objet de plusieurs types) et quand nous avons besoin de la valeur de chaque expression, nous pouvons utiliser l'indexation pour extraire cet élément.
{1,4,{4 5 6},[7 ;3]}{3}
ou
{a=1,b=4,c={4 5 6},[b ;3]}{4}
la source
Sautez les points-virgules!
Je vais utiliser cette réponse pour illustrer le point.
Le code d'origine était:
Après avoir supprimé les points-virgules, il peut être réduit comme suit, économisant trois octets:
Cela peut être utilisé à plusieurs endroits, et des choses que vous n'essayez même pas, car il semble qu'une erreur de syntaxe fonctionne souvent.
la source
Ceci est simple mais utile.
Dans Octave, mais pas MATLAB, vous pouvez faire comme en C ++:
la source
Un autre simple, mais utile (impossible dans MATLAB):
Attribuez la même valeur à plusieurs variables:
la source
Utilisez
eval
!Inspiré par la réponse de Luis Mendo ici .
Les fonctions anonymes sont dans la plupart des cas plus courtes que la création d'un script nécessitant un ou plusieurs appels à
input('')
. L'inconvénient est que les boucles et les modifications variables (telles que l'échange de deux éléments dans une matrice) sontimpossibles àréaliser.Avec
eval
, vous pouvez récupérer l'entrée comme vous le faites avec une fonction anonyme normale et exécuter le script comme vous le faites avec un script normal:Considérez ceci :
Par rapport à cela:
Le code est identique, mais la section d'entrée est beaucoup plus courte.
Cela peut également être utilisé pour modifier des variables d'entrée, comme ceci (crédit à Luis Mendo pour cela!):
la source
Utiliser
rows(a)
au lieu desize(a,1)
la source
Astuces connexes, mais pas identiques pour MATLAB .
Une caractéristique peu connue et peu utilisée 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 ou deux octets lors de l'utilisation
disp
. Tout le travail suivant, et donne le même résultat:Si vous avez des espaces, vous devez avoir les guillemets:
Voici d'autres exemples moins utiles:
la source