C# Matrix Klasse schreiben?

3 Antworten

Du meinst vermutlich, dass so eine Funktion "GetLength(int dimension)" z.B. in Deiner Klasse in das Array hinduchgeschleift werden muss.

int GetLength(int Dimension) {return myArray.GetLength(Dimension);}

Eine schöne Lösung habe ich dafür aber auch nicht, Array sind da aber eine Ausnahme, denn mit Collections, Dictionaries etc kann man so etwas ohne Weiteres machen.

Natürlich kannst du deine eigene Klasse als Array/List/Collection erstellen. Entweder du erbst von einer solchen Klasse oder du implementierst entsprechende Schnittstellen und programmierst die Methoden selbst.

Du musst die Daten ja nicht so nach außen geben, wie du sie intern speicherst.

Vielleicht erklärst du aber nochmal genauer, was du eigentlich willst. Eventuell mit Beispielcode.

Ja aber kann ich eine Vererbung von Array dann auch so einschränken das ich nur 2-dimensionale Arrays erstellen darf?

Für den Beispielcode siehe Antwort von EightSix.

0

Oh warte mein Gott bin ich blöd es reicht einfach wenn ich von Array erbe und das ganze dann in dem Konstruktor einschränke so dass ich nur zwei dimensionale arrays erstellen kann oder?

0
@okarin

Du kannst keine Klasse direkt von Array ableiten; das ist dem Compiler vorbehalten. Du kannst aber von IList implementieren.

Ich würde die Daten der Matrix zwar als 2-dim. Array speichern, aber über eine Column- und Row-Eigenschaft (jeweils als 1-dim. Array) nach außen geben, um den Zugriff auf die einzelnen Elemente zu erhalten. Das macht die Verwendung der Matrix einfacher und transparenter, wie ich finde.

Schau dir mal die Interfaces ICollection, IList, IEnumerable etc. an. An sich würde ich davon abraten von Listen zu erben oder Listen-Schnittstellen zu implementieren, weil du dir damit Methoden einhandelst, die du gar nicht brauchst. Erstelle die notwendigen Methoden selbst.

0

Mach mal ein Beispiel was du meinst.

Ich schick jetzt einfach mal den Code:

class Matrix
{
#region Fields
private double[,] matrixArray;
#endregion Fields

#region Properties
public double this[int i, int j]
{
get
{
return this.matrixArray[i, j];
}

set
{
this.matrixArray[i, j] = value;
}
}

public double[,] MatrixArray
{
get
{
return matrixArray;
}
}

#endregion Properties

#region Constructor
public Matrix()
{
this.matrixArray = null;
}

public Matrix(int heigth, int width)
{
this.matrixArray = new double[heigth, width];
}

public Matrix(double[,] m)
{
this.matrixArray = m;
}
#endregion Constructor

#region Operatoren

public static Matrix operator+(Matrix a, Matrix b)
{
// Matritzen müssen gleiche größen haben
if (a.MatrixArray.GetLength(0) != b.MatrixArray.GetLength(0) || a.MatrixArray.GetLength(1) != b.MatrixArray.GetLength(1))
{
throw new MatrixFalseFormatException();
}

Matrix m = new Matrix(a.MatrixArray.GetLength(0), a.MatrixArray.GetLength(1));

// Jedes Element addieren
for(int i = 0; i < m.MatrixArray.GetLength(0); i++)
{
for(int j = 0; j < m.MatrixArray.GetLength(1); j++)
{
m[i, j] = a[i, j] + b[i, j];
}
}

return m;
}

public static Matrix operator-(Matrix a, Matrix b)
{
// Matritzen müssen gleiche größen haben
if (a.MatrixArray.GetLength(0) != b.MatrixArray.GetLength(0) || a.MatrixArray.GetLength(1) != b.MatrixArray.GetLength(1))
{
throw new MatrixFalseFormatException();
}

Matrix m = new Matrix(a.MatrixArray.GetLength(0), a.MatrixArray.GetLength(1));

// Jedes Element subtraieren
for (int i = 0; i < m.MatrixArray.GetLength(0); i++)
{
for (int j = 0; j < m.MatrixArray.GetLength(1); j++)
{
m[i, j] = a[i, j] - b[i, j];
}
}

return m;
}

public static Matrix operator*(Matrix a, Matrix b)
{
if (a.MatrixArray.GetLength(1) != b.MatrixArray.GetLength(0))
{
throw new MatrixFalseFormatException();
}

Matrix m = new Matrix(a.MatrixArray.GetLength(0), b.MatrixArray.GetLength(1));

// Zeilen mit Spalten multiplizieren
for (int i = 0; i < m.MatrixArray.GetLength(0); i++)
{
for (int j = 0; j < m.MatrixArray.GetLength(1); j++)
{
for (int k = 0; k < a.MatrixArray.GetLength(1); k++)
{
m[i, j] += a[i, k] * b[k, j];
}
}
}

return m;
}

public static Matrix operator^(Matrix a, uint b)
{
for (int i = 0; i < b; i++)
{
a *= a;
}

return a;
}
#endregion Operatoren
}

Wenn ich damit jetzt beispielsweise die größe der Matrix abfragen will muss ich auf die Property MatrixArray zugreifen um dann auf GetLength() zuzugreifen. Jetzt wäre es natürlich schön wenn GetLength() direkt zu meiner Klasse Matrix gehört. Ich könnte jetzt natürlich für alle Funktionen die ich benutzen will eine extra Funktion in Matrix anlegen was dann aber einfach nicht schön ist. Deshalb hab ich an sowas wie Vererbung gedacht was aber auch nicht möglich ist.

0
@okarin

Würde an deiner Stelle eine Klasse schreiben für ein Matrix-Element und dann eine Klasse machen die von einer generischen, enumerierbaren Klasse erbt.

0

Matrix mit Array addieren in Java? Methodenkopf Matrix Probleme?

Hallo an alle Programmierer !

ich hab Probleme bei der Addition von Arrays in Java.

Folgenden Quellcode habe ich bisher :

public void add(Matrix m) {

    for (int i = 0; i < values.length; i++) {

    for (int j = 0; j < values[i].length; j++) {

            values[i][j] = values[i][j]+this.values[i][j];

    }}}

Ich würde gerne das Array values mit der Matrix m addieren. Doch wenn ich m verwende, sagt mir Eclipse "The type of the expression must be an array type but it resolved to a matrix".

Also sind Arrays ungleich Matrizen? Wie löse ich das Problem?

Vielen Dank im voraus ! Gruß

...zur Frage

Anzahl Array mit Inhalt in C#?

double[] i = new double [12];

alle arrays sind mit 0 vordefiniert weil sie leer sind.

jetzt habe ich manche Arrays im laufe des Programmes mit Zahlen gefüllt und möchte nun herausfinden wie viele Arrays beschrieben sind.

Wenn nur 4 Arrays Daten enthalten, dann will Ich mit der 4 weiterrechnen, aber ich bekomme es nicht mehr hin.

...zur Frage

Vokabeltrainer in C#?

Moin Moin,

ich möchte unbedingt C# lernen. Mittlerweile erstelle ich meine ersten Projekte.

Das letzte Projekt ist ein Vokabeltrainer in WinForms. Ich habe eine Klasse Vokabeln erstellt und die Vokabeln verwalte ich im Programm selbst in einem Array.

Das ist natürlich weniger schön, ich würde die Vokabeln lieber in einer Datenbank oder in einem Textfeld speichern. Wie ich die txt-Datei einlese ist auch klar.

Mein aktueller Stand ist der, das ich in dem deutschen Textfeld in der GUI die Vokabel sehe. Nun möchte ich aber nur den ersten Teil der Vokabel sehen (bis zum ";" in der Txt-Datei).

Und wie schreibe ich dann den Algorithmus, das der Compiler den Wert vor dem ";" mit dem Wert hinter dem ";" vergleicht? Kann mir da jemand helfen? Was zufällige Abfragen etc angeht, gibt es keine Probleme!

Ich hoffe mein Anliegen ist etwas klar :)

...zur Frage

Lehrplan Fachinformatiker Systemintegration Programmierung?

Hi :)

mache gerade eine Ausbildung zum Fachinformatiker Systemintefration im Baden-Württemberg.

Hatte vor kurzem meinen letzen Schultag.

Leider hat meine Schule Lehrermangel und das in den zwei wichtigsten Fächern: ITS und SAE(=Programmierung)

In ITS sind wir gerade so mit dem Stoff durchgekommen.


So, nun zum Sorgenkind SAE.

Folgendes haben wir gemacht: C#-Programmierung:

-Deklaration

-Initialisierung

-Datentypen

-Objekte

-Eigene Klasse und Methode

-Bedingte Anweisung

-Exception Handling

-Datenfelder, Getter, Setter

-Klassen auslagern

-Arrays

-Konstruktor

-For-Schleife

-Modulo

-Klasse Random

-WF->Eigenschaften

-Boolsche Operatoren


Das haben wir alles in C# gemacht. Ich weiß, dass die meisten Schulen Java machen aber das ist ja fast gleich.

Ich will dem Lehrer keinen Vorwurf machen, der ist mega gechillt, hat viel für uns getan, alles Lernmaterial online gestellt für uns usw....

Jedoch habe ich erfahern, dass man normalerweise in SAE noch u.a. Diagrammarten macht, z.B. Struktogramm, PAP, Activity Diagramm. Das haben wir NIE gemacht, von Struktogrammen habe ich schonmal gehört, weiß ungefähr den Aufbau aber trotzdem...

Was wird in SAE mi 1.LJ (in BW-->da ist der Lehrplan anders) noch gemacht was nicht oben steht.

Ich möchte das nachholen, Mitte des 2. LJ ist Zwischenpfüfung. Beim FISY zählt die Zwischenprüfung zwar nichts aber trotzdem...

...zur Frage

Was möchtest Du wissen?