Welche allgemeinen Tipps haben Sie zum Golfen in MATLAB? Ich bin auf der Suche nach Ideen, die sich auf Code-Golf-Probleme im Allgemeinen anwenden lassen, die zumindest etwas MATLAB-spezifisch sind (z. B. "Kommentare entfernen" ist keine Antwort). Bitte posten Sie einen Tipp pro Antwort.
14
Antworten:
Das muss man wissen, bevor man mit dem Golfen beginnt:
In MATLAB-Berechnungen verhält sich ein Zeichen genauso wie sein ASCII-Code.
quelle
Kürzen von Eigenschaftsnamen
In MATLAB können Zeichenfolgen, die Eigenschaften identifizieren, gekürzt werden, solange dies nicht zu Mehrdeutigkeiten führt.
Das hat mir tatsächlich eine Herausforderung eingebracht :)
quelle
name, value
Paaren gilt, wie oben gezeigt. (Also nicht zu Dingen wiesort(rand(4,1),'descend')
)conv(1:5,[1 1],'s')
zum Beispielconv(1:5,[1 1],'same')
Das Casting als Zeichen kann durch Verketten mit einem Zeichen erfolgen:
Das spart zwar nur ein Zeichen, kann aber recht häufig verwendet werden.
quelle
Zeichenfolgen sind nur Zeichenzeilenvektoren. Dies bedeutet, dass anstelle von
du kannst einfach schreiben
Zum ersten Mal habe ich dies verwendet: /codegolf//a/58387/32352
quelle
Wurzeln der Einheit durch diskrete Fourier-Transformation
Gegeben eine positive ganze Zahl
n
, der Standard - Weg , die zur Erzeugungn
-te Wurzeln der Einheit istDies gibt die Wurzeln an
1
und bewegt sich in der positiven Winkelrichtung. Wenn die Bestellung keine Rolle spielt, kann diese auf gekürzt werdenDa
exp(2j*pi/4)
gleich der imaginären Einheit (j
) ist, kann dies wie folgt kompakter geschrieben werden (Trick aufgrund von @flawr ):oder
Die diskrete Fourier-Transformation bietet jedoch einen noch kürzeren Weg (dank @flawr zum Entfernen von zwei unnötigen Klammern):
was die Wurzeln gibt, die
1
in der positiven Winkelrichtung beginnen und sich bewegen; oderdie beginnt bei
1
und bewegt sich in negativer Winkelrichtung.Probieren Sie alle oben genannten Punkte hier aus .
quelle
fft(1:n==2)
Iteration über Vektoren in Matrizen.
Wenn ein Satz von Vektoren als Matrix angegeben wird, können Sie diese tatsächlich über eine einzelne for-Schleife iterieren
während "traditionell" hätten Sie es wahrscheinlich gerne getan
Diesen Trick habe ich erst jetzt bei dieser Herausforderung von @Suever gelernt .
quelle
Verwandte, aber nicht identische Tipps für Octave .
Ein wenig bekanntes und wenig verwendetes Merkmal von MATLAB und Octave ist, dass die meisten eingebauten Funktionen ohne Klammern aufgerufen werden können. In diesem Fall behandeln sie alles, was darauf folgt, als Zeichenkette (solange es keine Leerzeichen enthält). Wenn es Leerzeichen enthält, benötigen Sie Anführungszeichen. Dies kann häufig verwendet werden, um ein Byte zu speichern, wenn Folgendes verwendet wird
disp
:Andere, weniger nützliche Beispiele sind:
Ich habe dies tatsächlich zweimal in der "Wie hoch können Sie zählen?" -Herausforderung:
ist äquivalent zu
strchr('sssssssssssssst','t')
und kehrt zurück15
.ist äquivalent zu
nnz('nnnnnnnnnnnnnn')
und kehrt zurück14
.Sachen wie
gt r s
funktioniert auch (äquivalent zu'r'>'s'
odergt('r','s')
.quelle
nnz
kann manchmal ein paar Bytes sparen:A
. Anstelle vonsum(sum(A))
odersum(A(:))
können Sie verwendennnz(a)
(nnz
implizit gilt(:)
).numel(x)
verwendennnz(x)
. Dies gilt zum Beispiel, wennx
es sich um eine Zeichenfolge handelt.quelle
2D-Faltungskerne
Dies ist vielleicht ein Nischenthema, aber anscheinend nutzen manche Leute die Faltung gern für verschiedene Dinge. [Zitat benötigt]
In 2D werden häufig folgende Kernel benötigt:
Dies kann mit erreicht werden
das ist kürzer als
Ein anderer häufig verwendeter Kernel ist
die mit gekürzt werden kann
quelle
toeplitz([0 1 0])
Ich finde mich ziemlich oft dabei , ein Mandelbrot-Bild zu berechnen
meshgrid
oderndgrid
, lassen Sie uns sagen, wir initialisieren zFür die Mandelbrotmenge benötigen wir nun eine weitere Matrix
c
der Größex
undy
aber mit Nullen initialisiert. Dies kann leicht durch Schreiben erfolgen:Sie können es auch auf einen anderen Wert initialisieren:
Sie können jedoch tatsächlich einige Bytes sparen, indem Sie einfach eine weitere Dimension hinzufügen in
meshgrid/ndgrid
:Und Sie können dies so oft tun, wie Sie möchten:
quelle
Die eingebauten
ones
undzeros
sind in der Regel eine Platzverschwendung. Sie können das gleiche Ergebnis erzielen, indem Sie einfach ein Array / eine Matrix (der gewünschten Größe) mit 0 multiplizieren (um die Ausgabe von zu erhaltenzeros
) und 1 addieren, wenn Sie die Ausgabe von möchtenones
.Dies funktioniert auch, wenn Sie einen Spalten- oder Zeilenvektor mit Nullen oder Einsen in der Größe einer Dimension einer Matrix erstellen möchten.
Wenn Sie eine Matrix mit einer bestimmten Größe erstellen möchten, können Sie sie verwenden,
zeros
aber Sie können auch einfach das letzte Element auf 0 setzen und MATLAB den Rest ausfüllen lassen.quelle
~(1:n)
für 1-d-Null-Vektoren.Summation einer Folge von Funktionen
Zum Summieren von Funktionen f (x_n), bei denen n ein Vektor aufeinanderfolgender ganzer Zahlen ist, wird feval anstelle von symsum empfohlen.
Beachten Sie, dass eine elementare Operation
.*
und./
anstelle von paarweisen binären Operationen*
und notwendig ist/
Wenn die Funktion naiv geschrieben werden kann, ist keine der beiden letzten Möglichkeiten geeignet.
Wenn die Funktion beispielsweise lautet
log
, können Sie einfach Folgendes ausführen:,sum(log(1:n))
was Folgendes darstellt:für relativ raffinierte Funktionen, wie
log(n)/x^n
Sie dies tun können:und in einigen Fällen sogar kürzer, wenn eine Funktion länger ist als
f(x)=e^x+sin(x)*log(x)/x
...das ist bemerkenswert kürzer als
sum(feval(@(y)e.^(1:n)+sin(1:n).*log(1:n)./(1:n),1:n))
Hinweis: Dieser Trick kann für andere inklusive Operatoren als
prod
oder angewendet werdenmean
quelle