Wenn ich beispielsweise den Mittelwert von lesen möchte magic(5)
, kann ich dies folgendermaßen tun:
M = magic(5);
value = M(3,3);
zu bekommen value == 13
. Ich möchte in der Lage sein, so etwas zu tun:
value = magic(5)(3,3);
value = (magic(5))(3,3);
auf die Zwischenvariable verzichten. MATLAB beschwert sich jedoch über Unbalanced or unexpected parenthesis or bracket
die erste Klammer vor dem 3
.
Ist es möglich, Werte aus einem Array / einer Matrix zu lesen, ohne sie zuvor einer Variablen zuzuweisen?
matlab
indexing
matrix
return-value
variable-assignment
Joe Kearney
quelle
quelle
testmatrix('magi', 5)(3, 3)
auf Scilab undmagic(5)(3, 3)
auf Octave wirken beide wie ein Zauber!Antworten:
Es tatsächlich ist möglich zu tun , was Sie wollen, aber Sie haben die funktionale Form des Indizierungsoperators verwenden. Wenn Sie eine Indizierungsoperation mit ausführen
()
, rufen Sie diesubsref
Funktion tatsächlich auf . Also, obwohl Sie dies nicht tun können:Sie können dies tun:
Hässlich, aber möglich. ;)
Im Allgemeinen müssen Sie nur den Indizierungsschritt in einen Funktionsaufruf ändern, damit nicht zwei Sätze von Klammern unmittelbar aufeinander folgen. Eine andere Möglichkeit, dies zu tun, besteht darin, eine eigene anonyme Funktion für die Indexierung zu definieren . Zum Beispiel:
Wenn alles gesagt und getan ist, ist die temporäre lokale Variablenlösung jedoch viel besser lesbar und definitiv das, was ich vorschlagen würde.
quelle
clear
über die vorübergehende (was niemand jemals der Fall ist) - die temporäre neigt länger dableibenEs gab nur gute Blog - Post auf Loren auf der Art von Matlab ein paar Tagen mit ein paar Edelsteine , die helfen könnten. Insbesondere mit Hilfsfunktionen wie:
wo
paren()
kann wie verwendet werdenwürde zurückkehren
Ich würde auch vermuten, dass dies schneller sein wird als die Antwort von gnovice, aber ich habe es nicht überprüft (Verwenden Sie den Profiler !!!). Davon abgesehen müssen Sie diese Funktionsdefinitionen auch irgendwo einfügen. Ich persönlich habe sie auf meinem Weg zu unabhängigen Funktionen gemacht, weil sie sehr nützlich sind.
Diese und andere Funktionen sind jetzt im Add-On für funktionale Programmierkonstrukte verfügbar, das über den MATLAB-Add-On-Explorer oder über den Dateiaustausch verfügbar ist .
quelle
myfunc().attr
?myfunc()
eine Struktur zurückgegeben wird, die ein Attribut enthältattr
, mussattr
ich dies tun , um auf den aktuellen Zugriff zuzugreifenS = myfunc(); S.attr
. Die Frage ist, ob wir eine Helferfunktion haben können, wiegetattr(myfunc(), 'attr')
in Analogie zu denparen
undcurly
Helfern. Ich verstehe nicht, was dies mit der Datenbank-Toolbox zu tun hat.Wie stehen Sie zur Verwendung von undokumentierten Funktionen:
oder für Zellarrays:
Genau wie Magie :)
AKTUALISIEREN:
Schlechte Nachrichten, der obige Hack funktioniert in R2015b nicht mehr ! Das ist in Ordnung, es war eine undokumentierte Funktionalität und wir können uns nicht auf sie als unterstützte Funktion verlassen :)
Wenn Sie sich fragen, wo Sie solche Dinge finden können, schauen Sie im Ordner nach
fullfile(matlabroot,'bin','registry')
. Dort gibt es eine Reihe von XML-Dateien, in denen alle Arten von Extras aufgelistet sind. Seien Sie gewarnt, dass das direkte Aufrufen einiger dieser Funktionen Ihre MATLAB-Sitzung leicht zum Absturz bringen kann.quelle
':'
, um den Fehler zu vermeidenUndefined function or variable "builtin"
.builtin('_paren', magic(5), ':', 2)
(an bestimmten Stellen funktioniert es ohne die Anführungszeichen direkt:
im Gegensatz zu':'
, wie wenn Sie in der Eingabeaufforderung direkt und nicht innerhalb einer Funktion ausgeführt werden. Ich denke Das ist ein Fehler im Parser!)end
?end
funktioniert die ganze Trickerei in dieser Syntax nicht, Sie müssen in Ihrer Indizierung explizit sein. (Gleiche Einschränkung gilt für die meisten anderen aufgelisteten Antworten)Zumindest in MATLAB 2013a können Sie Folgendes verwenden
getfield
:um das Element bei (1,2) zu erhalten
quelle
Leider wird syntax like
magic(5)(3,3)
von matlab nicht unterstützt. Sie müssen temporäre Zwischenvariablen verwenden. Sie können den Speicher nach Gebrauch freigeben, zquelle
Beachten Sie, dass wenn Sie die Laufzeiten mit der Standardmethode vergleichen (das Ergebnis zuordnen und dann auf Einträge zugreifen), diese genau gleich sind.
Meiner Meinung nach lautet das Fazit: MATLAB hat keine Zeiger, man muss damit leben.
quelle
Es könnte einfacher sein, wenn Sie eine neue Funktion erstellen:
und dann benutze es:
quelle
subref
macht ... aber allgemeiner.Ihre anfängliche Notation ist der prägnanteste Weg, dies zu tun:
Wenn Sie dies in einer Schleife tun, können Sie M jedes Mal neu zuweisen und auch die klare Anweisung ignorieren.
quelle
Um Amros Antwort zu ergänzen, können Sie
feval
stattdessen anstelle von verwendenbuiltin
. Es gibt wirklich keinen Unterschied, es sei denn, Sie versuchen, die Operatorfunktion zu überladen:Interessant ist, dass
feval
diesbuiltin
zumindest in Matlab 2013b nur ein kleines bisschen schneller zu sein scheint (um ~ 3,5%), was seltsam ist, dafeval
überprüft werden muss, ob die Funktion überlastet ist, im Gegensatz zubuiltin
:quelle
feval
macht das "normale" Ding und kann daher diese Liste voll ausnutzen.builtin
muss woanders suchen, damit es nur eingebaute Funktionen findet. Wahrscheinlich ist dieser Fall nicht annähernd so stark optimiert wie der „normale“ Fall, denn warum sollten Sie Geld in die Optimierung von etwas stecken, das nicht sehr oft verwendet wird?