Suche…


Benennen Sie keine Variablen mit einem vorhandenen Funktionsnamen

Es gibt bereits eine Funktion sum() . Wenn wir also eine Variable mit demselben Namen benennen

sum = 1+3;

und wenn wir versuchen, die Funktion zu verwenden, während die Variable noch im Arbeitsbereich vorhanden ist

A = rand(2);
sum(A,1)

Wir werden den kryptischen Fehler erhalten :

Subscript indices must either be real positive integers or logicals.

clear() zuerst die Variable und verwenden Sie dann die Funktion

clear sum

sum(A,1)
ans =
       1.0826       1.0279

Wie können wir überprüfen, ob bereits eine Funktion existiert, um diesen Konflikt zu vermeiden?

Verwenden Sie which() mit der -all :

which sum -all
sum is a variable.
built-in (C:\Program Files\MATLAB\R2016a\toolbox\matlab\datafun\@double\sum)   % Shadowed double method
...

Diese Ausgabe sagt uns, dass sum zuerst eine Variable ist und dass die folgenden Methoden (Funktionen) von ihr abgeschattet werden, dh MATLAB versucht zuerst, unsere Syntax auf die Variable anzuwenden, anstatt die Methode zu verwenden.

Was Sie sehen, ist NICHT das, was Sie bekommen: char vs cellstring im Befehlsfenster

Dies ist ein grundlegendes Beispiel für neue Benutzer. Es konzentriert sich nicht darauf, den Unterschied zwischen char und cellstring .


Es kann vorkommen, dass Sie die ' in Ihren Strings entfernen möchten, obwohl Sie sie niemals hinzugefügt haben. Tatsächlich handelt es sich dabei um Artefakte , mit denen das Befehlsfenster zwischen einigen Typen unterscheidet.

Eine Zeichenfolge wird gedruckt

s = 'dsadasd'
s =
dsadasd

Ein Zellstring wird gedruckt

c = {'dsadasd'};
c = 
    'dsadasd'

Beachten Sie, wie die einfachen Anführungszeichen und die Vertiefung Artefakte uns benachrichtigen sind , dass c a cellstring eher als ein char . Der String ist tatsächlich in der Zelle enthalten, dh

c{1}
ans =
dsadasd

Die Transponieroperatoren

  • .' ist der richtige Weg, um einen Vektor oder eine Matrix in MATLAB zu transponieren .
  • ' ist der richtige Weg, um die komplexe konjugierte Transponierung (auch als hermitianisches Konjugat bezeichnet) eines Vektors oder einer Matrix in MATLAB zu verwenden.

Beachten Sie das für die Umsetzung .' Es gibt eine Periode vor dem Apostroph. Dies entspricht der Syntax für die anderen elementweisen Operationen in MATLAB: * multipliziert Matrizen ,. .* Multipliziert Elemente von Matrizen miteinander. Die beiden Befehle sind sehr ähnlich, jedoch konzeptionell sehr verschieden. Wie andere MATLAB-Befehle sind diese Operatoren "syntaktischer Zucker", der zur Laufzeit in einen "richtigen" Funktionsaufruf umgewandelt wird. So wie aus == eine Bewertung der EQ- Funktion wird, denken Sie an .' als Abkürzung für transpose . Wenn Sie nur ' (ohne Punkt) schreiben würden, verwenden Sie stattdessen den Befehl ctranspose , der die komplexe konjugierte Transponierung berechnet, die auch als hermitisches Konjugat bezeichnet wird und häufig in der Physik verwendet wird. Solange der transponierte Vektor oder die Matrix reell ist, erzeugen die beiden Operatoren dasselbe Ergebnis. Sobald wir jedoch mit komplexen Zahlen umgehen, werden wir unweigerlich auf Probleme stoßen, wenn wir nicht die "richtige" Abkürzung verwenden. Was "richtig" ist, hängt von Ihrer Bewerbung ab.

Betrachten Sie das folgende Beispiel einer Matrix C die komplexe Zahlen enthält:

>> C = [1i, 2; 3*1i, 4]
C =
   0.0000 + 1.0000i   2.0000 + 0.0000i
   0.0000 + 3.0000i   4.0000 + 0.0000i

Nehmen wir die Transponierung mit der Abkürzung .' (mit der Periode). Die Ausgabe ist wie erwartet die transponierte Form von C

>> C.'
ans =
   0.0000 + 1.0000i   0.0000 + 3.0000i
   2.0000 + 0.0000i   4.0000 + 0.0000i

Nun lassen Sie uns ' (ohne Punkt) verwenden. Wir sehen, dass die komplexen Werte neben der Transposition auch in ihre komplexen Konjugate umgewandelt wurden .

>> C'
ans =
   0.0000 - 1.0000i   0.0000 - 3.0000i
   2.0000 + 0.0000i   4.0000 + 0.0000i

Um zusammenzufassen, wenn Sie das hermitianische Konjugat berechnen wollen, setzen Sie das komplexe Konjugat um, und verwenden Sie ' (ohne Punkt). Wenn Sie nur die Transponierung berechnen möchten, ohne die Werte komplex zu konjugieren, verwenden Sie .' (mit der Periode).

Undefinierte Funktion oder Methode X für Eingabeargumente des Typs Y

Auf diese Weise sagt MATLAB, dass die Funktion, die Sie aufrufen möchten, nicht gefunden werden kann. Es gibt verschiedene Gründe, warum Sie diesen Fehler erhalten könnten:

Diese Funktion wurde nach Ihrer aktuellen Version von MATLAB eingeführt

Die MATLAB-Onlinedokumentation bietet eine sehr nette Funktion, mit der Sie feststellen können, in welcher Version eine bestimmte Funktion eingeführt wurde. Es befindet sich auf jeder Seite der Dokumentation unten links:

Geben Sie hier die Bildbeschreibung ein

Vergleichen Sie diese Version mit Ihrer eigenen aktuellen Version ( ver ), um festzustellen, ob diese Funktion in Ihrer bestimmten Version verfügbar ist. Ist dies nicht der Fall, suchen Sie in den archivierten Versionen der Dokumentation nach einer geeigneten Alternative in Ihrer Version.

Sie haben diese Werkzeugkiste nicht!

Die Basis-MATLAB-Installation verfügt über eine Vielzahl von Funktionen. Spezialisierte Funktionen werden jedoch in Toolboxes gepackt und separat von Mathworks vertrieben. Die Dokumentation für alle Toolboxen ist sichtbar, unabhängig davon, ob Sie über die Toolbox verfügen oder nicht. Überprüfen Sie also, ob Sie über die entsprechende Toolbox verfügen.

Um zu überprüfen, zu welcher Toolbox eine bestimmte Funktion gehört, sehen Sie oben links in der Online-Dokumentation, ob eine bestimmte Toolbox erwähnt wird.

Geben Sie hier die Bildbeschreibung ein

Sie können dann feststellen, welche Toolboxen Ihre Version von MATLAB installiert hat, indem Sie den Befehl ver ausgeben, der eine Liste aller installierten Toolboxes ausgibt.

Wenn Sie diese Toolbox nicht installiert haben und die Funktion verwenden möchten, müssen Sie eine Lizenz für diese bestimmte Toolbox von The Mathworks erwerben.

MATLAB kann die Funktion nicht finden

Wenn MATLAB Ihre Funktion immer noch nicht finden kann, muss es sich um eine benutzerdefinierte Funktion handeln. Es befindet sich möglicherweise in einem anderen Verzeichnis und dieses Verzeichnis sollte dem Suchpfad hinzugefügt werden, damit der Code ausgeführt werden kann. Sie können überprüfen, ob MATLAB Ihre Funktion finden kann, indem Sie angeben which welche den Pfad zur Quelldatei zurückgeben soll.

Beachten Sie die Ungenauigkeit von Fließkommazahlen

Fließkommazahlen können nicht alle reellen Zahlen darstellen. Dies ist als Ungenauigkeit des Fließkommas bekannt.

Es gibt unendlich viele Fließkommazahlen, und diese können unendlich lang sein (z. B. π ). π sie perfekt darstellen zu können, wäre unendlich viel Speicher erforderlich. Da dies ein Problem war, wurde eine spezielle Darstellung für das Speichern von "reellen Zahlen" im Computer entworfen, der IEEE 754-Standard . Kurz gesagt, es beschreibt, wie Computer diese Art von Zahlen speichern, mit einem Exponenten und einer Mantisse wie:

floatnum = sign * 2^exponent * mantissa

Mit einer begrenzten Anzahl von Bits für jedes von diesen kann nur eine endliche Genauigkeit erreicht werden. Je kleiner die Anzahl, desto kleiner die Lücke zwischen den möglichen Zahlen (und umgekehrt!). Sie können Ihre realen Zahlen in dieser Online-Demo ausprobieren.

Seien Sie sich dieses Verhaltens bewusst und versuchen Sie, den Vergleich aller Gleitkommazahlen und ihre Verwendung als Stoppbedingungen in Schleifen zu vermeiden. Siehe zwei Beispiele:

Beispiele: Vergleich von Fließkommazahlen falsch gemacht:

>> 0.1 + 0.1 + 0.1  == 0.3

ans =

  logical

   0

Es ist nicht üblich, den Vergleich von Fließkommazahlen zu verwenden, wie im vorhergehenden Beispiel gezeigt. Sie können es überwinden, indem Sie den absoluten Wert ihrer Differenz mit einem (kleinen) Toleranzwert vergleichen.

Nachfolgend ein weiteres Beispiel, bei dem eine Gleitkommazahl in einer while-Schleife als Stoppbedingung verwendet wird: **

k = 0.1;
while k <= 0.3 
  disp(num2str(k));
  k = k + 0.1;
end

% --- Output: ---
0.1
0.2

Es fehlt die letzte erwartete Schleife ( 0.3 <= 0.3 ).

Beispiel: Gleitpunktvergleich RECHTS:

x = 0.1 + 0.1 + 0.1;
y = 0.3;
tolerance = 1e-10; % A "good enough" tolerance for this case.

if ( abs( x - y ) <= tolerance )
  disp('x == y');
else
  disp('x ~= y');
end

% --- Output: ---
x == y

Einige Dinge zu beachten:

  • Wie erwartet, werden x und y jetzt als äquivalent behandelt.
  • Im obigen Beispiel wurde die Toleranzwahl willkürlich gewählt. Daher ist der gewählte Wert möglicherweise nicht für alle Fälle geeignet (insbesondere wenn mit viel kleineren Zahlen gearbeitet wird). Die intelligente Wahl der Grenze kann mit der eps Funktion erfolgen, dh N*eps(max(x,y)) , wobei N eine problemspezifische Zahl ist. Eine vernünftige Wahl für N , die ebenfalls ausreichend ist, ist 1E2 (obwohl im obigen Problem auch N=1 ausreichen würde).

Lesen Sie weiter:

In den folgenden Fragen finden Sie weitere Informationen zur Ungenauigkeit von Gleitkommazahlen:

Nicht genügend Eingabeargumente

Anfänglich werden MATLAB-Entwickler mit dem Editor von MATLAB Code schreiben und bearbeiten, insbesondere benutzerdefinierte Funktionen mit Ein- und Ausgängen. Am oberen Rand befindet sich die Schaltfläche Ausführen , die in den letzten Versionen von MATLAB verfügbar ist:

Geben Sie hier die Bildbeschreibung ein

Wenn der Entwickler mit dem Code fertig ist, werden sie oft versucht, die Schaltfläche Ausführen zu drücken. Für einige Funktionen wird dies einwandfrei funktionieren, für andere wird jedoch der Fehler " Not enough input arguments angezeigt und Sie werden verwirrt sein, warum der Fehler auftritt.

Der Grund dafür, dass dieser Fehler möglicherweise nicht auftritt, ist, dass Sie ein MATLAB-Skript oder eine Funktion geschrieben haben, die keine Eingabeargumente enthält. Die Run - Taste wird ein Testskript ausführen oder eine Funktion unter der Annahme , keine Eingabeargumente ausführen. Wenn Ihre Funktion Eingabeargumente erfordert, tritt der Fehler Not enough input arguments auf, da Sie eine Funktion geschrieben haben, die erwartet, dass Eingaben in die Funktion gehen. Daher können Sie nicht erwarten, dass die Funktion ausgeführt wird, indem Sie einfach die Run- Taste drücken.

Um dieses Problem zu demonstrieren, nehmen wir an, wir haben eine Funktion mult , die einfach zwei Matrizen miteinander multipliziert:

function C = mult(A, B)
    C = A * B;
end

Wenn Sie diese Funktion in den letzten MATLAB-Versionen geschrieben und auf die Schaltfläche Ausführen geklickt haben, erhalten Sie den Fehler, den wir erwarten:

>> mult
Not enough input arguments.

Error in mult (line 2)
    C = A * B;

Es gibt zwei Möglichkeiten, dieses Problem zu beheben:

Methode 1 - Über die Eingabeaufforderung

Erstellen Sie einfach die benötigten Eingaben in der Eingabeaufforderung, und führen Sie dann die Funktion mit den von Ihnen erstellten Eingaben aus:

A = rand(5,5);
B = rand(5,5);
C = mult(A,B);

Methode 2 - Interaktiv durch den Editor

Unter der Schaltfläche Ausführen befindet sich ein dunkelschwarzer Pfeil. Wenn Sie auf diesen Pfeil klicken, können Sie die Variablen angeben, die Sie aus dem MATLAB-Arbeitsbereich erhalten möchten, indem Sie die Art und Weise eingeben, in der Sie die Funktion genau so aufrufen möchten, wie Sie sie in Methode 1 gesehen haben. Stellen Sie sicher, dass die Variablen, die Sie innerhalb der Funktion angeben, im MATLAB-Arbeitsbereich vorhanden sind:

Achten Sie auf Änderungen der Array-Größe

Einige übliche Operationen in MATLAB, wie Differenzierung oder Integration , geben Ergebnisse aus, die eine andere Anzahl von Elementen aufweisen als die Eingabedaten. Diese Tatsache kann leicht übersehen werden, was in der Regel zu Fehlern führen würde, wie die Matrix dimensions must agree . Betrachten Sie das folgende Beispiel:

t = 0:0.1:10;        % Declaring a time vector
y = sin(t);          % Declaring a function

dy_dt = diff(y);     % calculates dy/dt for y = sin(t)

Nehmen wir an, wir möchten diese Ergebnisse darstellen. Wir schauen uns die Array-Größen an und sehen:

size(y) is 1x101
size(t) is 1x101

Aber:

size(dy_dt) is 1x100

Das Array ist ein Element kürzer!

Stellen Sie sich nun vor, Sie haben Messdaten von Positionen im Zeitverlauf und möchten den Ruck (t) berechnen. Sie erhalten ein Array mit drei Elementen weniger als das Zeitfeld (da der Ruck die Position ist, die dreimal differenziert wird).

vel = diff(y);       % calculates velocity vel=dy/dt for y = sin(t)  size(vel)=1x100
acc = diff(vel);     % calculates acceleration acc=d(vel)/dt         size(acc)=1x99
jerk = diff(acc);    % calculates jerk jerk=d(acc)/dt                size(jerk)=1x98   

Und dann Operationen wie:

x = jerk .* t;          % multiplies jerk and t element wise

Rückgabefehler, weil die Matrixabmessungen nicht übereinstimmen.

Um Operationen wie oben zu berechnen, müssen Sie das größere Array an das kleinere anpassen. Sie können auch eine Regression ( polyfit ) mit Ihren Daten polyfit , um ein Polynom für Ihre Daten zu erhalten.

Fehler bei Dimensionsabweichungen

Fehler bei Dimensionsabweichungen treten normalerweise auf, wenn:

  • Nicht auf die Form der zurückgegebenen Variablen aus Funktions- / Methodenaufrufen achten. In vielen integrierten MATLAB-Funktionen werden Matrizen in Vektoren umgewandelt, um die Berechnungen zu beschleunigen, und die zurückgegebene Variable ist möglicherweise immer noch ein Vektor und nicht die erwartete Matrix. Dies ist auch ein häufiges Szenario, wenn logische Maskierung involviert ist.
  • Verwendung inkompatibler Arraygrößen beim Aufrufen der impliziten Arrayerweiterung .

Die Verwendung von "i" oder "j" als imaginäre Einheit, Schleifenindizes oder gemeinsame Variable.

Empfehlung

Da die Symbole i und j in MATLAB sehr unterschiedliche Dinge darstellen können, hat ihre Verwendung als Schleifenindizes die MATLAB-Benutzergemeinschaft seit Ewigkeiten gespalten. Einige historische Gründe könnten dazu beitragen, dass sich das Gleichgewicht zu einer Seite neigt, dies ist jedoch nicht mehr der Fall, und die Entscheidung liegt nun vollständig bei Ihnen und den von Ihnen gewählten Kodierungspraktiken.

Die aktuellen offiziellen Empfehlungen von Mathworks sind:

  • Da i eine Funktion ist, kann sie überschrieben und als Variable verwendet werden. Es ist jedoch am besten, die Verwendung von i und j für Variablennamen zu vermeiden, wenn Sie diese in einer komplexen Arithmetik verwenden möchten.
  • Verwenden Sie für Geschwindigkeit und verbesserte Robustheit in komplexen Arithmetik 1i und 1j anstelle von i und j .

Standard

In MATLAB sind die Buchstaben i und j standardmäßig eingebaute function , die sich beide auf die imaginäre Einheit in der komplexen Domäne beziehen.

Standardmäßig ist also i = j = sqrt(-1) .

>> i
ans =
   0.0000 + 1.0000i
>> j
ans =
   0.0000 + 1.0000i

und wie Sie erwarten sollten:

>> i^2
ans =
    -1

Verwendung als Variable (für Schleifenindizes oder andere Variablen)

MATLAB erlaubt die Verwendung des eingebauten Funktionsnamens als Standardvariable. In diesem Fall zeigt das verwendete Symbol nicht mehr auf die eingebaute Funktion, sondern auf Ihre eigene benutzerdefinierte Variable. Diese Vorgehensweise wird jedoch im Allgemeinen nicht empfohlen, da dies zu Verwirrung, schwierigem Debugging und Wartung führen kann ( siehe das andere Beispiel do-not-name-a-variable-mit-an-existierender-Funktionsname ).

Wenn Sie in Bezug auf die Einhaltung von Konventionen und bewährten Methoden äußerst pedantisch sind, sollten Sie sie nicht als Schleifenindizes in dieser Sprache verwenden. Der Compiler erlaubt es jedoch und ist vollkommen funktionsfähig. Sie können also auch alte Gewohnheiten beibehalten und als Schleifeniterator verwenden.

>> A = nan(2,3);
>> for i=1:2        % perfectly legal loop construction
       for j = 1:3
        A(i, j) = 10 * i + j;
       end
   end

Beachten Sie, dass die Schleifenindizes am Ende der Schleife nicht außerhalb des Gültigkeitsbereichs liegen. Sie behalten also ihren neuen Wert.

>> [ i ; j ]
ans =
     2
     3

Wenn Sie sie als Variable verwenden, stellen Sie sicher, dass sie vor der Verwendung initialisiert werden. In der Schleife oberhalb von MATLAB initialisieren Sie sie automatisch, wenn sie die Schleife vorbereitet. Wenn sie jedoch nicht ordnungsgemäß initialisiert wird, können Sie schnell feststellen, dass Sie versehentlich complex Zahlen in Ihr Ergebnis einfügen können.

Wenn Sie später die Spiegelung der eingebauten Funktion rückgängig machen müssen (= Sie möchten, dass i und j die imaginäre Einheit wieder darstellen), können Sie die Variablen clear :

>> clear i j

Sie verstehen jetzt die Vorbehalte von Mathworks, sie als Schleifenindizes zu verwenden, wenn Sie sie in einer komplexen Arithmetik verwenden möchten. Ihr Code würde mit variablen Initialisierungen und clear Befehlen durchsetzt sein, um den ernsthaftesten Programmierer ( ja Sie dort! ... ) und Programmunfälle, die darauf warten, zu verwirren.

Wenn keine komplexe Arithmetik erwartet wird, ist die Verwendung von i und j perfekt funktionsfähig und es gibt keinen Leistungsnachteil.


Verwendung als imaginäre Einheit:

Wenn Ihr Code mit complex Zahlen umgehen muss, sind i und j sicherlich von Nutzen. Aus Gründen der Disambiguierung und sogar für Aufführungen wird jedoch empfohlen, anstelle der Abkürzungssyntax das vollständige Formular zu verwenden. Die vollständige Form ist 1i (oder 1j ).

>> [ i ; j ; 1i ; 1j]
ans =
   0.0000 + 1.0000i
   0.0000 + 1.0000i
   0.0000 + 1.0000i
   0.0000 + 1.0000i

Sie repräsentieren den gleichen Wert sqrt(-1) , aber die spätere Form:

  • ist auf semantische Weise expliziter.
  • ist wartungsfähiger (jemand, der sich später Ihren Code ansieht, muss den Code nicht lesen, um herauszufinden, ob i oder j eine Variable oder die imaginäre Einheit war).
  • ist schneller (Quelle: Mathworks).

Beachten Sie, dass die vollständige Syntax 1i mit einer beliebigen Nummer vor dem Symbol gültig ist:

>> a = 3 + 7.8j
a =
   3.0000 + 7.8000i

Dies ist die einzige Funktion, die Sie mit einer Nummer belegen können, ohne dass ein Operator dazwischen steht.


Fallstricke

Ihre Verwendung als imaginäre Einheit ODER- Variable ist absolut legal, hier nur ein kleines Beispiel, wie verwirrend es sein könnte, wenn beide Verwendungen gemischt werden:

Wir überschreiben i und machen es zu einer Variablen:

>> i=3
i =
     3

Jetzt ist i eine Variable (hält den Wert 3 ), aber wir überschreiben nur die Kurzschreibweise der imaginären Einheit, die vollständige Form wird immer noch richtig interpretiert:

>> 3i
ans =
   0.0000 + 3.0000i

Damit können wir nun die dunkelsten Formulierungen erstellen. Ich lasse Sie die Lesbarkeit aller folgenden Konstrukte bewerten:

>> [ i ; 3i ; 3*i ; i+3i ; i+3*i ]
ans =
   3.0000 + 0.0000i
   0.0000 + 3.0000i
   9.0000 + 0.0000i
   3.0000 + 3.0000i
  12.0000 + 0.0000i

Wie Sie sehen, gibt jeder Wert im obigen Array ein anderes Ergebnis zurück. Obwohl jedes Ergebnis gültig ist (vorausgesetzt, dass dies die ursprüngliche Absicht war), werden die meisten von Ihnen zugeben, dass es ein echter Alptraum wäre, einen mit solchen Konstrukten durchsetzten Code zu lesen.

Verwendung von "Länge" für mehrdimensionale Arrays

Ein häufiger Fehler, den MATLAB-Codierer haben, ist die Verwendung der length für Matrizen (im Gegensatz zu Vektoren , für die sie bestimmt ist). Die length , wie in ihrer Dokumentation erwähnt , " die Länge der größten Array-Dimension " der Eingabe zurück.

Für Vektoren hat der Rückgabewert von length zwei verschiedene Bedeutungen:

  1. Die Gesamtzahl der Elemente im Vektor.
  2. Die größte Dimension des Vektors.

Im Gegensatz zu Vektoren sind die obigen Werte für Arrays mit mehr als einer Nicht-Singleton-Dimension (dh, deren Größe größer als 1 ) nicht gleich. Deshalb ist die Verwendung von length für Matrizen mehrdeutig. Stattdessen wird die Verwendung einer der folgenden Funktionen empfohlen, auch wenn Sie mit Vektoren arbeiten, um die Absicht des Codes klar zu machen:

  1. size(A) - gibt einen Zeilenvektor zurück, dessen Elemente die Anzahl der Elemente entlang der entsprechenden Dimension von A .
  2. numel(A) - gibt die Anzahl der Elemente in A . Äquivalent zu prod(size(A)) .
  3. ndims(A) - gibt die Anzahl der Dimensionen im Array A . Entspricht der numel(size(A)) .

Dies ist besonders wichtig beim Schreiben von "zukunftssicheren", vektorisierten Bibliotheksfunktionen, deren Eingaben im Voraus nicht bekannt sind und verschiedene Größen und Formen haben können.



Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow