Matlab - Fehler: Unterschied zwischen den Versionen

Aus Physik
Zur Navigation springen Zur Suche springen
Zeile 22: Zeile 22:
 
x = [-1,0.05,1] Zeilenvektor [-1 0.05 1]
 
x = [-1,0.05,1] Zeilenvektor [-1 0.05 1]
 
x = [-1:0.05:1] Bereich von bis [-1 -0.95 -0.9 ... 0.9 0.95 1]
 
x = [-1:0.05:1] Bereich von bis [-1 -0.95 -0.9 ... 0.9 0.95 1]
  +
  +
=== Überprüfung von Übergabeparametern ===
  +
  +
==== Aufgabenstellung ====
  +
  +
Es soll eine MATLAB-Funktion <tt>test</tt> geschrieben werden, die für den zweiten Inputparameter einen Defaultwert von <tt>5</tt> setzt und zwar für den Fall wenn dieser nicht übergeben wird oder wenn er leer <tt>[]</tt> ist.
  +
  +
==== Mögliche Lösungen ====
  +
  +
* Zwei getrennte bedingte Anweisungen, wobei die Variable <tt>nargin</tt> dabei als Zähler für die Anzahl der übergebenen Inputparameter fungiert.
  +
function r = test(a,b)
  +
bd = 5; % Defaultwert für b
  +
if nargin < 2, b = bd; end
  +
if isempty(b), b = bd; end
  +
r = a + b;
  +
  +
* Zwei gekoppelte bedingte Anweisungen
  +
function r = test(a,b)
  +
bd = 5; % Defaultwert für b
  +
if nargin < 2
  +
b = bd;
  +
elseif isempty(b)
  +
b = bd;
  +
end
  +
r = a + b;
  +
  +
* Lösung mit einer bedingten Anweisung unter Verwendung des Befehls <tt>or</tt> in seiner "short circuit" Version <tt>||</tt>
  +
function r = test(a,b)
  +
bd = 5; % Defaultwert für b
  +
if nargin < 2 || isempty(b), b = bd; end
  +
r = a + b;
  +
  +
* Alternative für <tt>nargin</tt> mit Hilfe des Befehls <tt>exist</tt>
  +
function r = test(a,b)
  +
bd = 5; % Defaultwert für b
  +
if ~exist('b','var') || isempty(b), b = bd; end
  +
r = a + b;
  +
  +
* Ergänzung um eine Fehlermitteilung
  +
function r = test(a,b)
  +
bd = 5; % Defaultwert für b
  +
if nargin < 1 || isempty(a), error('a muss übergeben werden!'); end
  +
if nargin < 2 || isempty(b), b = bd; end
  +
r = a + b;
  +
  +
* Lösung mit variabler Inputliste, wobei <tt>varargin</tt> eine Zelle mit allen Inputparametern ist.
  +
function r = test(varargin)
  +
bd = 5;
  +
a = varargin{1};
  +
if nargin < 2 || isempty(varargin{2})
  +
b = bd;
  +
else
  +
b = varargin{2};
  +
end
  +
r = a + b;

Version vom 18. April 2005, 08:02 Uhr

In jeder Programmiersprache, so auch in Matlab, gibt es eine Reihe von Fehlermöglichkeiten, die dazu führen, dass das Programm scheinbar ordnungsgemäß beendet wird. Trotzdem ist das Ergebnis falsch oder zumindest entspricht es nicht den Erwartungen. Einige dieser Fehler sind lustig, andere für Anfänger oft verblüffend.

Sie können hier zu einer Sammlung und Beschreibung dieser Fehler beitragen, da ich glaube, dass man daraus sehr viel lernen kann.

Verwechslung von : und ;

Ein Plot der Funktion f(x) = sin(π x) im Intervall [-1,1] wurde mit folgendem Code versucht:

x = [-1;0.05;1]; y = sin(pi*x); plot(x,y)

Falsche Darstellung

Dabei wurden die Zeichen ; und : verwechselt. Der richtige Code müsste daher so lauten:

x = [-1:0.05:1]; y = sin(pi*x); plot(x,y)

Richtige Darstellung

Der Grund, das Matlab hier keine Fehlermitteilung liefert, liegt darin, dass zwar für das gewünschte Ziel ein falscher Befehl verwendet wurde, dieser Befehl aber eine korrekte Syntax hat:

x = [-1;0.05;1]   Spaltenvektor    [-1
                                     0.05
                                     1]
x = [-1,0.05,1]   Zeilenvektor     [-1 0.05 1]
x = [-1:0.05:1]   Bereich von bis  [-1 -0.95 -0.9 ... 0.9 0.95 1]

Überprüfung von Übergabeparametern

Aufgabenstellung

Es soll eine MATLAB-Funktion test geschrieben werden, die für den zweiten Inputparameter einen Defaultwert von 5 setzt und zwar für den Fall wenn dieser nicht übergeben wird oder wenn er leer [] ist.

Mögliche Lösungen

  • Zwei getrennte bedingte Anweisungen, wobei die Variable nargin dabei als Zähler für die Anzahl der übergebenen Inputparameter fungiert.
function r = test(a,b)
bd = 5; % Defaultwert für b
if nargin < 2, b = bd; end
if isempty(b), b = bd; end
r = a + b;
  • Zwei gekoppelte bedingte Anweisungen
function r = test(a,b)
bd = 5; % Defaultwert für b
if nargin < 2
  b = bd;
elseif isempty(b)
  b = bd;
end
r = a + b;
  • Lösung mit einer bedingten Anweisung unter Verwendung des Befehls or in seiner "short circuit" Version ||
function r = test(a,b)
bd = 5; % Defaultwert für b
if nargin < 2 || isempty(b), b = bd; end
r = a + b;
  • Alternative für nargin mit Hilfe des Befehls exist
function r = test(a,b)
bd = 5; % Defaultwert für b
if ~exist('b','var') || isempty(b), b = bd; end
r = a + b;
  • Ergänzung um eine Fehlermitteilung
function r = test(a,b)
bd = 5; % Defaultwert für b
if nargin < 1 || isempty(a), error('a muss übergeben werden!'); end
if nargin < 2 || isempty(b), b = bd; end
r = a + b;
  • Lösung mit variabler Inputliste, wobei varargin eine Zelle mit allen Inputparametern ist.
function r = test(varargin)
bd = 5;
a = varargin{1};
if nargin < 2 || isempty(varargin{2})
  b = bd;
else
  b = varargin{2};
end
r = a + b;