WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

Verständnisfrage zu Funktionen

 

papiertigre
Forum-Anfänger

Forum-Anfänger


Beiträge: 26
Anmeldedatum: 23.11.11
Wohnort: ---
Version: R2011b
     Beitrag Verfasst am: 23.11.2011, 15:28     Titel: Verständnisfrage zu Funktionen
  Antworten mit Zitat      
Hallo,
ich schreibe grade meine erste Funktion und kann die Fehlermeldung nicht ganz verstehen.

Code:
% Das ist meine Funktion.
function [ out ] = compare ( a, b )
%Vektorvergleich der Beträge

if size(a)==1 && size(b)==1
    outa= sqrt(sum(a.*a));
    outb= sqrt(sum(b.*b));
else 'Das ist eine Matrix, kein Vektor'
    out=0;
end
if outa>outb
    'Betrag des 1. Vektor ist größer'
    out=outa;
else
    'Betrag des 2. Vektor ist größer'
    out=outb;
end


end

 


Fehlermeldung
Code:

 
>> compare (a,b)
Operands to the || and && operators must be convertible to logical scalar values.

Error in compare (line 4)
if size(a)==1 && size(b)==1


ist diese if Abfrage mit dem == nicht erlaubt?
Wie sage ich der Funktion, dass sie nicht bis zum Ende durchrödeln soll, wenn eine Matrix, statt ein Vektor eingegeben wurde?
Private Nachricht senden Benutzer-Profile anzeigen


Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 23.11.2011, 15:43     Titel: Re: Verständnisfrage zu Funktionen
  Antworten mit Zitat      
Hallo papiertigre,

Das Problem liegt bei SIZE: Dies gibt die Dimensionen des Inputs zurück, und die bestehen aus mindestens zwei Werten. wenn "size(a)" also z.B. [2,3] ist, bekommst Du "[2,3]==1" und das ergibt [false, false]. Der && Operator benötigt aber ein skalare Werte.

Wenn Du testen möchtest, ob ein Array ein Vektor ist, funktioniert das in modernen Matlab-Versionen mit "isvector" oder mit:
Code:

Das berücksichtigt Zeile- und Spalten-Vektoren.

Gruß, Jan

Zuletzt bearbeitet von Jan S am 24.11.2011, 09:14, insgesamt einmal bearbeitet
Private Nachricht senden Benutzer-Profile anzeigen
 
papiertigre
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 26
Anmeldedatum: 23.11.11
Wohnort: ---
Version: R2011b
     Beitrag Verfasst am: 24.11.2011, 09:13     Titel: Re: Verständnisfrage zu Funktionen
  Antworten mit Zitat      
Jan S hat Folgendes geschrieben:
Hallo papiertigre,

Das Problem liegt bei SIZE: Dies gibt die Dimensionen des Inputs zurück, und die bestehen aus mindestens zwei Werten. wenn "size(a)" also z.B. [2,3] ist, bekommst Du "[2,3]==1" und das ergibt [false, false]. Der && Operator benötigt aber ein skalare Werte.

Gruß, Jan


Danke für die Erklärung.
Ich habe den Code nun so geändert:

Code:


function [ out ] = compare ( a, b )
%UNTITLED Summary of this function goes here
%   Detailed explanation goes here
if size(a)>1
     'Das ist eine Matrix, kein Vektor'
    out=0;
elseif size(b)>1
     'Das ist eine Matrix, kein Vektor'
    out=0;
end

outa=sqrt(sum(a.*a));
outb=sqrt(sum(b.*b));
if outa>outb
    'Betrag des 1. Vektor ist größer'
    out=outa;
else
    'Betrag des 2. Vektor ist größer'
    out=outb;
end


end
 


Ich glaube die Funktion macht jetzt auch fast das was ich will, Beispiel:

Code:


a =

     1     2     3     4     5     6     7     8

>> b=[100]

b =

   100

>> compare (a,b)

ans =

Betrag des 2. Vektor ist größer


ans =

   100
 


Nur wenn beide size() Werte größer 1 sind, ist die Bedingung erfüllt, also beim Vektor kann ruhig ein size Wert >1 sein, ohne dass meine Funktion behauptet es wäre eine Matrix.

Nu meine Zweite Frage:
Wie bekomme ich meine Funktion zum erfrühten Abbruch, wenn eine Matrix eingegeben wurde. Warum wird die Funktion trotzdem bis zum Ende durchgeführt?

Code:


>> a=[1,2,3;4,5,6]

a =

     1     2     3
     4     5     6

>> b=[10 20 30;40 50 60]

b =

    10    20    30
    40    50    60
>> compare (a,b)

ans =

Das ist eine Matrix, kein Vektor


ans =

Betrag des 2. Vektor ist größer


ans =

   41.2311   53.8516   67.0820
 
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 24.11.2011, 09:20     Titel: Re: Verständnisfrage zu Funktionen
  Antworten mit Zitat      
Hallo papiertigre,

Nein, "if size(a)>1" ist kein stabiler Test für Matrizen. Auch IF benötigt eigentlich einen Skalar als Bedingung, "size(a)>1" ist aber immer noch ein Vektor. Aus Gründen der Rückwärtskompatibilität führt Matlab dann dies aus:
Code:
% if size(a)>1  ==>
if all(size(a) > 1) && ~isempty(size(a) > 1)

Gleichzeitig mit Deiner Mitteilung hatte ich meine zurückliegende editiert. Siehe dort: "isvector(a)" oder "if ndims(a)==2 && length(a)==numel(a)".

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
papiertigre
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 26
Anmeldedatum: 23.11.11
Wohnort: ---
Version: R2011b
     Beitrag Verfasst am: 24.11.2011, 11:55     Titel: Re: Verständnisfrage zu Funktionen
  Antworten mit Zitat      
Jan S hat Folgendes geschrieben:
Hallo papiertigre,

Das Problem liegt bei SIZE: Dies gibt die Dimensionen des Inputs zurück, und die bestehen aus mindestens zwei Werten. wenn "size(a)" also z.B. [2,3] ist, bekommst Du "[2,3]==1" und das ergibt [false, false]. Der && Operator benötigt aber ein skalare Werte.

Wenn Du testen möchtest, ob ein Array ein Vektor ist, funktioniert das in modernen Matlab-Versionen mit "isvector" oder mit:
Code:

Das berücksichtigt Zeile- und Spalten-Vektoren.

Gruß, Jan


Danke.
habe es nun mit dem einfach isvector() befehl erledigt.

Code:

function [ out ] = compare ( a, b )

if isvector(a)== 0 || isvector(b)== 0
     'Das ist eine Matrix, kein Vektor'
    out=0;
end

outa=sqrt(sum(a.*a));
outb=sqrt(sum(b.*b));
if outa>outb
    'Betrag des 1. Vektor ist größer'
    out=outa;
else
    'Betrag des 2. Vektor ist größer'
    out=outb;
end


end
 


Eine Frage bleibt bisher aber dennoch offen: Wie bekomme ich die Funktion dazu abzubrechen und '0' auszugeben, falls eine Matrix vorliegt? Bei mir gibt sie trotzdem einen Wert als Antwort.
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen



Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

Du kannst Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.
Du kannst Dateien in diesem Forum posten
Du kannst Dateien in diesem Forum herunterladen
.





 Impressum  | Nutzungsbedingungen  | Datenschutz | FAQ | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2025 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks

MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.