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

Operator Überladung für verschiedene Datentypen

 

Larvae

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 08.06.2016, 08:42     Titel: Operator Überladung für verschiedene Datentypen
  Antworten mit Zitat      
Hallo,

Ich schreibe zurzeit an einer Ausarbeitung für eine Vorlesung. Dabei geht es um Verschiedene Berechnungen mit Bezierfunktionen. Für mehr Übersichtlichkeit würde ich dabei gerne ein paar Teile des Codes in Klassen kapseln.

Meine Bezierfunktion stellt dabei ein Volumen dar, daher benötige ich hier bereits eine 3D-Matrix, um alle Kontrollpunkte zu speichern, und jeder Punkt hat xyz-Koordinaten.

Um jetzt nicht mit einer 4D-Matrix arbeiten zu müssen wollte ich eine Klasse für den 3D-Punkt erstellen. Funktioniert an sich auch soweit, allerdings würde ich gerne die Operatoren angemessen überladen.

Folgendes Verhalten würde ich gerne erhalten:

Code:

P1 = Point3D(x,y,z) % Irgendwelche Koordinaten
P2 = 3 * P1 % Einfache Multiplikation mit einem Skalar
P3 = P1.coords * 3 % Direktzugriff auf die Daten der Klasse
 


Für Addition von zwei Punkten Funktioniert alles. Aber für die Multiplikation bekomme ich immer die Fehlermeldung, die Operation sei für struct nicht definiert. Wenn ich das Array mit den Koordinaten direkt anspreche funktioniert es. Es funktioniert auch, wenn ich zwei Punkte miteinander multiplizieren will (abgesehen davon, dass dafür die Implementierung falsch ist und ich darüber dann eine Fehlermeldung erhalte)

Kann mir jemand sagen, wie ich die Operationen korrekt überlade, damit ich das gewünschte verhalten bekomme? Also z.B. für die zu überladende Funktion Datentypen für die Argumente Vorgebe oder ähnliches. Würde das selbe gerne noch mit anderen Klassen erreichen.

Grüße

Thorsten


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.495
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 08.06.2016, 17:51     Titel:
  Antworten mit Zitat      
Hallo,

stelle doch bitte deine Points3D zur Verfügung.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Larvae

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 09.06.2016, 08:02     Titel:
  Antworten mit Zitat      
Hi,

meine Klasse sieht momentan so aus:

Code:

classdef Point3D
   
   properties
       coords = [0 0 0];
   end
   
   methods
       function P = Point3D(x,y,z)
            P.coords = [x,y,z];
       end
       
       function P = plus(A,B)
           P.coords = A.coords+B.coords;
       end
       function P = minus(A,B)
           P.coords = A.coords-B.coords;
       end
       function P = uminus(A)
           P.coords = -A.coords;
       end
       function P = times(A,B)
           P.coords = A* B.coords;
       end
       function P = mtimes(A,B)
           P.coords = A* B.coords;
       end
   end
   
end
 


times und mtimes sehen momentan gleich aus, weil ich, als es nicht funktioniert hat, sichergehen wollte, dass ich nicht die Falsche der beiden genommen habe. Also hab ich einfach beide probiert.
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.495
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 09.06.2016, 21:51     Titel:
  Antworten mit Zitat      
Hallo,

die ersten beiden Zeilen funktionieren bei mir.
Dann ist P2 allerdings ein struct, was auch nicht wirklich verwundert. Du hast in deinen arithmetischen Operatoren nämlich nie angegeben, dass P ein Point3D sein soll.

Eine Notlösung:
Code:
      function P = mtimes(A,B)
           P = B;
           P.coords = A* B.coords;
       end


Sinnvoller wäre es allerdings, den Klassenkonstruktor so zu definieren, dass auch ein Vektor von Koordindaten übergeben werden kann. Dann kann man den Konstruktor in den arithmetischen Operatoren aufrufen.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Larvae

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 16.06.2016, 10:03     Titel:
  Antworten mit Zitat      
Hi,

Danke für den Hinweis. Aber ich bin mir nicht sicher, ob ich Dich richtig verstehe. Habe deine Version für die Multiplikation eingefügt, aber bekomme trotzdem den Fehler. Hab es auch mit der Vektor-Version des Constructors versucht, da bekomme ich die gleiche Fehlermeldung. Mein Code sieht jetzt so aus:


main.m:

Code:

P1 = Point3D([1,1,1]);
P2 = Point3D([2,2,2]);
P3 = 3*P2;
 



Point3D.m:

Code:


classdef Point3D
   
   properties
       coords = [0 0 0];
   end
   
   methods
       function P = Point3D(vec)
            P.coords = vec;
       end
       
       function P = mtimes(A,B)
           vec = A * B.coords;
           P = Point3D(vec);
       end
   end
   
end

 
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.495
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 16.06.2016, 11:42     Titel:
  Antworten mit Zitat      
Hallo,

bei mir läuft dein Code fehlerfrei durch und liefert ein Point3D-Objekt P3.

Falls du mehrere Versionen hast: bist du sicher, dass die richtige ausgeführt wird?

In älteren Versionen von MATLAB muss man nach Veränderung von Klassen
Code:
eingeben, damit die aktuelle Version genutzt wird.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Larvae

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 16.06.2016, 12:07     Titel:
  Antworten mit Zitat      
Hi

Danke für die Hilfe, jetzt scheint es zu funktionieren.

Hatte den geposteten Code gekürzt und nur das drinnen gelassen, was scheinbar nicht funktioniert hat. Das funktioniert bei mir auch. Anscheinend war in der Funktion uminus ein Fehler, und das hat irgendwie dazu geführt, dass ich in der anderen Funktion eine Fehlermeldung für die Multiplikation bekommen habe. Matlab hat aber immer nur gesagt, dass die Multiplikation nicht definiert sei, uminus selbst hatte funktioniert.
 
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 - 2024 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.