Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

02.08.2013, 18:00

[C#] Matrix-Klasse - Eigenschaft oder (getter) Funktion und "static" oder nicht

Hallo liebes Forum :) !

Ich bin momentan gerade dabei, in C# eine Matrix Klasse zu programmieren. Die Planung, wie was funktionieren soll, gibt's schon und meine Frage ist auch schon fast eher "ästhetischer" Natur ;) .
Und zwar folgendes:

Eine Matrix kann ja, durch spiegeln an ihrer Hauptachse transponiert werden (wikipedia: http://de.wikipedia.org/wiki/Matrix_(Mathematik)#Die_transponierte_Matrix) .
Meine Frage ist nun: Soll ich die Transponierte Matrix...

  1. ... entweder als Eigenschaft der Matrix-Klasse definieren? Es gäbe dann nur einen "get"-Zweig und der Rückgabewert wäre dann ein Matrix Objekt, das die transponierte Matrix darstellt...
  2. ... oder als "getter" Methode? Prinzipiell wie bei 1, nur halt nicht in einer Eigenschaft, sonder auf "klassische" Art, mit wieder einem Matrix-Objekt als Rückgabewert...
  3. ... oder als Methode, die die Matrix, auf die sie aufgerufen wird, direkt veränder? Die Daten werden in einem 2D-Array gespeichert und das könnte ich beim Aufruf der Methode halt verändern. Es würde somit kein neues Matrix-Objekt erzeugt, sondern halt das alte Verändert werden...
  4. ... oder als statische Methode der Matrixklasse, mit einem Matrix-Objekt als Parameter. Rückgabewert wäre dann entweder wieder ein anderes Matrix-Objekt oder ich verändere die Matrix direkt (wie bei 3. ) .

Hier mal wie die Matrix-Klasse ungefähr aussieht:


C#-Quelltext

1
2
3
4
5
public class Matrix
{   
        private double[,] matrix;
    public byte M { get ; private set; }
public byte N { get ; private set; }}

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

2

02.08.2013, 18:07

#4 ist auf jeden Fall totaler Unfug.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Architekt

Community-Fossil

Beiträge: 2 481

Wohnort: Hamburg

Beruf: Student

  • Private Nachricht senden

3

02.08.2013, 18:12

#1 Versteh ich nicht so recht. Ich würde zu #2 tendieren.
Der einfachste Weg eine Kopie zu entfernen ist sie zu löschen.
- Stephan Schmidt -

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

4

02.08.2013, 18:14

In C# macht #1 aber mehr Sinn als #2.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

H5::

Treue Seele

Beiträge: 368

Wohnort: Kiel

  • Private Nachricht senden

5

02.08.2013, 18:26

Ich würde #5 nehmen... Aber nur weil ich der Meinung bin, da eine Transponieren keine Eigenschaft einer Matrix ist, sondern eine Operation auf eine Matrix ist.

Sprich ich würde z.B. Generische Transpose Funktion( gibt es so etwas in C#?)/Template( bei C++ ) oder derart nehmen die sich dann z.B. in einem Namensbereich Math befindet.

So würde ich es zumindest als sauber empfinden.
:love: := Go;

TrommlBomml

Community-Fossil

Beiträge: 2 117

Wohnort: Berlin

Beruf: Software-Entwickler

  • Private Nachricht senden

6

02.08.2013, 18:26

Ich würde eher zu #2 tendieren. Bei einem Property denke ich immer an das Liefern eines Wertes. Hier wird doch eher etwas "berechnet", daher würde ich zu einer Methode raten.

DeKugelschieber

Community-Fossil

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

7

02.08.2013, 18:45

Warum nicht #2 UND #3? Hab ich im Moment selbst so.

Legend

Alter Hase

Beiträge: 731

Beruf: Softwareentwickler

  • Private Nachricht senden

8

02.08.2013, 18:48

Performancetechnisch klingt für mich Nummer 3 am besten.
Am übersichtlichsten wäre wohl 1.
Nummer 4 finde ich grauenvoll. :nono:
"Wir müssen uns auf unsere Kernkompetenzen konzentrieren!" - "Juhu, wir machen eine Farm auf!"

Netzwerkbibliothek von mir, C#, LGPL: https://sourceforge.net/projects/statetransmitt/

9

02.08.2013, 23:24

Also erst mal danke für eure schnellen Antworten :) ... Und dann auch gleich schon mal sorry, eigentlich stand da noch mehr und den Code hat's leider auch wieder durcheinander gehauen... Kommt davon, wenn man mit mehreren Tabs gleichzeitig arbeitet :wacko: . Ich arbeite jetzt mal schnelles nochmal so ab, was hier nicht steht ;) :

@BlueCobold: Ich hatte mir das halt mit static so wie einen Art "Operator" vorgestellt... Oder wie wenn ich von einer Zahl z.B. den Cosinus berechnen lassen will. Dann benutze ich ja auch die statische Methode der Math-Klasse und rufe nicht irgendwie eine Kosinus-Methode auf die Zahl auf. Vielleicht ist es so zumindest' besser zu verstehen, warum ich die Möglichkeit überhaupt in Erwägung gezogen habe. Kann natürlich sein, dass sie trotzdem totaler Unfug ist ;) ...

@Architekt: Ich hatte mir halt gedacht, dass man die transponierte Matrix quasi als Eigenschaft einer jeden Matrix verstehen könnte. Der get-Zweig liefert diese dann zurück. Wobei ich mir halt nicht schlüssig bin (wie @H5:: ), ob die transponierte Matrix eine Eigenschaft einer anderen Matrix sein kann :thinking: ?


@BlueCobold: Wobei ich halt die Eigenschaftsmethoden für Eigenschaften benutze und ich bin mir wie schon gesagt echt nicht sicher, ob die transponierte Matrix eine Eigenschaft einer Matrix ist. Eigenschaft wäre für mich jetzt mehr so Zeilen- und Spaltenzahl oder auch die Anzahl der Elemente.


@H5:: : Jop, so hatte ich's mir halt auch gedacht, quasi wie als Operation auf eine Matrix. Wie halt auch den Kosinus auf eine Zahl. Inwiefern meinst du das mit der generischen Funktion? Also in C# gibt's auch "Templates" aber da heißen sie "Generics" ;) . Wobei die Funktion muss ja nur mit Matrizen arbeiten können, oder? Ich kenne keine anderen Objekte, die transponiert werden könnten. Bei mir spielt sich alles was mit Matrizen zu tun hat, in einem Namensbereich Math ab. Allerdings muss bei C# jede Funktion in einer Klasse gekapselt sein. Ich hätte die Transpose-Funktion als quasi Operation auf eine Matrix dann halt als static Methode in der Matrix Klasse definiert... Der Aufruf würde dann lauten:

C#-Quelltext

1
2
3
4
5
6
7
...
public void IrgendEineFunktion()
{    
    var mat1 = new Math.Matrix(3,5);
    var mat2 = Math.Matrix.GetTransposedMatrix(mat1);
}
...



@TrommlBomml: Ja, erst mal das und dann halt, wie jetzt schon öfters gesagt, m.M.n ein Objekt keine Eigenschaft eines Objekts vom selben Typen sein kann... Aber ich lasse mich gerne auch vom Gegenteil überzeugen ;) .

@DeKugelschieber: Beides hab' ich mir auch schon überlegt aber bevor ich das mache, will ich mir erst mal sichere sein, was ihr meint, was so das sauberste wäre :) .

@Legend: Aber halt auch am wenigsten "modular" ... Wenn ich z.B. eine Matrix transponieren will, ohne dabei die ursprüngliche zu verlieren, müsste ich sie erst kopieren und dann auf eine der beiden die "Transpose"-Methode aufrufen. Mit einer Matrix als Rückgabewert, könnte man entweder gleich die originale Matrix transponieren, aber auch bei bedarf eine neue direkt über den Rückgabewert "erstellen" . Übersichtlich ja, aber ob das so 100% im Sinne des Erfinders ist... Bin mir echt unschlüssig :/ . Ich verweise nochmal auf meine Überlegung, quasi als "Operator" ... Die werden ja auch als static definiert. Die Methode wäre dann quasi eine Art unärer Operator :) .

Aber mal anders gefragt: Ihr habt ein Matrix Objekt. Ihr wollt es transponieren. Was würdet ihr euch von einer Methode die das liefert erwarten? Dass sie ein neues Matrix-Objekt zurück liefert. Die alte Matrix überschreibt? Gar nicht direkt auf ein Matrix-Objekt aufgerufen wird (so wie z.B. der Kosinus auf einen double Wert) und dann ein neues Matrix-Objekt zurück liefert? Und dann vllt. nochmal warum :) .

So, hier jetzt noch nachträglich: Vielen Dank schon mal für eure Antworten!

Benni :)

P.S.: Würdet ihr die Matrix-Klasse im Namensbereich Math, Math.Matrix oder Math.Matrices definieren?
Ich habe nämlich, wenn die allg. Matrix-Klasse fertig ist, vor, einzelne Matrix-Klassen zu erstellen, die dann nur quadratisch sind und auch festgelegte Größen haben (z.B. 4x4 oder 3x3 Matrizen)... ? Weil dann wäre der Aufruf dann zwar etwas umständlicher

C#-Quelltext

1
2
3
4
...
var mat1 = new Math.Matrix.Matrix(3,3);
var mat2 = new Math.Matrix.Matrix3(); // Erstellt eine 3x3 Matrix
...


oder

C#-Quelltext

1
2
3
4
...
var mat1 = new Math.Matrices.Matrix(3,3);
var mat2 = new Math.Matrices.Matrix4(); // Erstellt eine 4x4 Matrix
...


anstatt

C#-Quelltext

1



aber halt auch übersichtlicher... Ob Math.Matrix oder Math.Matrices ist eig. auch nur ästhetik, aber irgenwie erscheint mir der Aufruf Math.Matrix.Matrix seltsam :S ...

P.P.S.: Soll ich die speziellen Matrizen dann von der Matrix-Klasse erben lassen und nur den Standard-Konstruktor passend anpassen oder ganz neu definieren, mit dann z.B. 9 oder 16 (double) Variablen (wie im Buch 3D-Spieleprogrammierung mit DirectX und C++ ) ? Nur so aus Interesse, wie ihr das machen würdet. Weil 'ne 3x3 Matrix ist ja nur ein speziellere, variable Matrix, also genau passend für Vererbung. Aber manche wünschen sich dann vllt. auch 9, 16, ... Variablen die sie direkt verändern können. Zu was würdet ihr tendieren. Oder würdet ihr sogar eine abstrakte Basisklasse für die Matrizen erstellen (mit z.B. nur der Zeilen, Spalten und Elementzahl) und dann darauf aufbauen. Sorry, das ich abschweife, aber das ist mir gerade noch eingefallen :P .

H5::

Treue Seele

Beiträge: 368

Wohnort: Kiel

  • Private Nachricht senden

10

03.08.2013, 00:05

Ich kann dir leider nur ein C++ Beispiel nennen, mit dem Template wollte ich dich nicht verwirren ich hatte nur daran gedacht, dass die Matrizen unterschiedliche Typen haben und deswegen ein generischer Ansatz sinnvoll sein könnte.

C-/C++-Quelltext

1
2
3
4
5
6
namespace Type
{
    template<unsigned m, unsigned n> class Matrix
    {
    };
}

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
namespace Math
{
    template<unsigned m, unsigned n> auto Transpose( const Type::Matrix<m, n>& matrix)
    -> Type::Matrix<n, m>
    {
        using Type::Matrix;

        // Todo: Transpose
        return Matrix<n, m>( );
    }
}

C-/C++-Quelltext

1
2
3
4
5
using Type::Matrix;
using Math::Transpose;

Matrix<3, 4> mat;
Matrix<4, 3> mat_T = Transpose(mat); // Eigentlich: auto mat_T...
:love: := Go;

Werbeanzeige