Methoden Matrix als 1D Array mit Werten füllen

VM

Mitglied
Hallo Leute,

ich bin zum Ersten mal hier unterwegs, daher erst ein mal vielen Dank, dass es so eine Möglichkeit gibt :applaus::toll:

Nun hoffe ich, dass mir geholfen werden kann. :confused:

Mein Problem ist eine Getter Methode für ein 1D Array, in welchem werte einer Matrix gespeichert werden, die nur Einträge auf der Hauptdiagonalen und x Nebendiagonalen hat (Bandmatrix).
Ich habe lange überlegt und leider keine Lösung gefunden, die sich universell anwenden lässt..
Im wesentliche versuche ich über die Spalten-/Zeileneingabe des Benutzers die Position im Feld zu ermitteln. Die klappt leider nur für den sehr simplen Fall, dass es sich um ein Hauptdiagonalen Element handelt, da diese den ersten Block im Array darstellt.

Hier mein Konstruktor für der/die/das ???:L 1D Array
Java:
/**
 * Konstruktor zur Erstellung einer symmetrischen Band-Matrix
 * Band Matrix wird als 1D-Feld, i welchem nur die Hauptdiagonale
 * und die unteren Bandbreiten-Elemten dargestellt werden, um Speicherplatz zu sparen
 * @param dim = Dimension der Matrix 
 */
public SymmetrischeBandMatrix(int dim,short bandbreite1)throws Ausnahme{
	// Ausnahmen für Bandbreite größer als Dimension der Matrix
	if (bandbreite1 > dim){
		throw new Ausnahme("Die Bandbreite übersteigt die Dimension der Matrix");
	}
	//Hilfsvariable um rekursive Folge mit Schleife darzustellen
	int laenge=0; 
	this.dim=dim;
	// Schleife um rekursive Folge darzustellen 
	for (int i=0; i<bandbreite1;i++){
		laenge += (dim-i);
	}
	// Feld mit der Laenge laenge wird erzeugt
	this.matrix1D=new double [laenge];
	}

Hier mein bisheriger Code für die Methode

Java:
ublic double getKoeffizient1D(int n,int m){
	// wenn n=m wird auf Element der Hauptdiagonalen zugegriffen
	if (n==m){
		return matrix1D[n];
	}
	// Schleife mit Start index 1
	for (int i=1; i<bandbreite1;i++)
       {
//i läuft bis zur Bandbreite
	if (n==m+i){
		return matrix1D[];//Stelle??! dim + dim -1 + dim -2 .... + m? 
	}
	if (n==m+1){
		return matrix1D[dim+m];
	}

	}

Wie man sieht klappt es händisch für n=m und n=m+1.
Eine Idee von mir war darauf zu spekulieren, dass der Benutzer nur Matrizen mit einer Dimension übergibt, die ich zuvor händisch möglich gemacht habe.:bloed: :bloed: :bloed:
Ziemlich dämlicher Ansatz, mit viel zu viel Arbeit.

:idea: Jetzt habe ich mir gedacht, dass ich einfach immer ans Ende eines Blocks laufe und dann wieder zurück zu dem Element, dass ich haben will.
Beispiel: Benutzer will den Wert an der Stelle 3,5 (Zeile(n),Spalte(m)).
Die Schleife stellt fest, dass n=m+2 ist. Jetzt müsste man in den 2. Block gehen.

Ansatz: Dimension(Anzahl Elemente auf Hauptdiagonalen)= dim

dim + dim-1 + dim-2 (nun stehe ich am Ende der Elemente der 2. Diagonalen) - (dim-2-m)
(jetzt sollte ich eigentlich am gewünschten Element stehen.)

Nur leider weiß ich nicht wie ich das als Schleife ausdrücken kann...


Daher wende ich mich hoffnungsvoll an euch.

Liebe Grüße
 

Gucky

Top Contributor
Warum bildest du eine zweidimensionale Struktur eindimensional ab?
Ich habe nicht ganz verstanden, wie du die Matrix speicherst.
Wenn es denn unbedingt eindimensional sein muss, würde ich es so machen:
Code:
1  2  3  4  5
6  7  8  9  10
11 12 13 14 15 = m5x5       Zahl in Matrix - 1 = Index im 1D Array
16 17 18 19 20
21 22 23 24 25

Die einzelnen Werte im 1D Array kannst du dann so ansprechen:
Code:
index = ((zeile - 1) * spaltenzahl + spalte) - 1
 
Zuletzt bearbeitet:

VM

Mitglied
hey,

das klappt leider nicht.

Ich hau ja nur die Diagonalen mit Werten in das Array..


Ist ein 1D Feld nicht günstiger als ein 2D Feld, im Bezug auf den verbrauchten Speicher?
 
Zuletzt bearbeitet:

Joose

Top Contributor
Ist ein 1D Feld nicht günstiger als ein 2D Feld, im Bezug auf den verbrauchten Speicher?


Also heutzutage sollte man sich um Speicher keine großen Sorgen machen! Diese Probleme kommen erst bei größeren Projekten, wo man vielleicht wirklich etwas speicherlastiges machen will.
Daher kannst du es ruhig als 2D Array abbilden.

Bzw. in Zukunft so programmieren wie es einfach logisch ist, sollte es dann Speicherprobleme geben kann man diese dann(!) immer noch lösen.
Also nicht davor schon Probleme beheben die nicht auftauchen müssen. Natürlich ist es Vorteilhaft wenn man weiß man könnte hier oder dort Probleme bekommen und das oder dies wären vielleicht mögliche Lösungen, aber diese sollten auch erst eingebaut werden wenn es zwingend wird!
 

VM

Mitglied
Ok :)

Danke für den Tipp :)

Ich frage mich grad wie ich am besten den Speicherbedarf berechne...
Es gilt ja: Maximale Datenmenge einer Double ist 64 bit.
Ist es dann (Bsp. 5x5 Matrix): 5*64bit + 5*64bit = 640 bist = 80 Bytes?



Wenn ich es als 2D-Feld auffasse, sieht mein Code wie folgt aus:

Java:
**
 * Konstruktor zur Erstellung einer symmetrischen Band-Matrix
 * Es werden nur die Hauptdiagonale, sowie die restlichen Bandbreiten-Elemten in einem double 2D-Feld gespeichert
 * Die Symmetrischen Einträge werden durch Getter / Setter Methoden simmuliert
 * @param dim = Dimension der Matrix
 */
public SymmetrischeBandMatrix(int dim, int bandbreite2)throws Ausnahme{
	if (bandbreite2 > dim){
		throw new Ausnahme ("Die Bandbreite übersteigt die Dimension der Matrix");
	}
this.dim=dim;
this.matrix2D=new double [dim][];
for (int i=0;i<bandbreite2;i++){
	matrix2D[i]=new double [dim-i];
	
}
}


/**
 * Getter Mehtode für 2D-Matrix Variante 
 * mit Zugriffsvertauschung bei Zugriff auf Elemente der Bandbreite außerhalb der unteren Dreiecksmatrix
 * Es werden keine Ausnahmen geworfen, da etwaige Fehler in der Setter-Methode behandelt werden
 */
public double getKoeffizient2D(int n, int m){
	if (n<m){
		int y = n;
		n = m;
		m = y;
		
	}
	
return matrix2D[n][m];	
}

/**
 * Setter Mehtode für 2D-Matrix Variante
 * wirft Ausnahme, falls auf ein Feld außerhalb der Matrix-Dimension zugegriffen werden soll
 */
public void setKoeffizient2D(int n, int m,double koeffizient)throws Ausnahme{
	// wirft Ausnahme falls Spalten oder Zeilenrang überschritten wird
	if (n+1 > bandbreite2 || m+1>bandbreite2){throw new Ausnahme("Einer oder mehrere der gesetzten Werte befinden sich außerhalb der Matrix-Dimension"); 
	}
	if (n<m){
	int y = n;
	n = m;
	m = y;
}
	matrix2D[n][m]= koeffizient;
}

Vielen Dank :)
 

Joose

Top Contributor
Ich frage mich grad wie ich am besten den Speicherbedarf berechne...
Es gilt ja: Maximale Datenmenge einer Double ist 64 bit.
Ist es dann (Bsp. 5x5 Matrix): 5*64bit + 5*64bit = 640 bist = 80 Bytes?

Hm viele Einträge passen in ein 5x5 Feld? ;)
Hier hat sich ein kleiner Fehler eingeschlichen bei dir.
Und desweiteren werden ja nicht nur die X Double gespeichert sondern noch vom Objekt der eine oder andere Overhead.
Wie gesagt um Speicher keine Sorgen machen, solange du nicht z.B. mehrere GB große Dateien parallel verarbeiten willst oä.
 

DrZoidberg

Top Contributor
Hilf dir der Ansatz hier?
Java:
public double getKoeffizient2D(int n, int m){
    if (n<m) return getKoeffizient2D(m, n);
    int positionInDiagonale = m;
    int nrDiagonale = n-m; //0 = Hauptdiagonale, 1 = erste Nebendiagonale usw.
}
 

VM

Mitglied
@Joose
Hm viele Einträge passen in ein 5x5 Feld?
5*5 = 25 Einträge
daraus folgt dann 25*64 bit = 200 bytes?

Kann ich das was im Overhead drin ist, irgendwie abschätzen?

Danke :)

@DrZoidberg
Hilft dir der Ansatz hier?

Erst einmal ist es gut zu wissen, dass ich als return auch eine Methode benutzen kann. An sich ist das auch einleuchtet, jetzt wo ich es weiß :)

Der Ansatz ist interessant, er hilft mir auf jeden Fall meine Schleife aus der Methode löschen zu können, da ich so einfacher an einen Wert kommen, mit dem ich sogar weiter rechnen kann :)
Ich hab aus dem Ansatz folgendes gebastelt:
Java:
public double GetKoeffizient1D(int n,int m){
	if (n<m){ return getKoeffizient2D(m, n);
	}
    int positionInDiagonale = m;
    int nrDiagonale = n-m; //0 = Hauptdiagonale, 1 = erste Nebendiagonale usw.
    int positionArray=0;
    for (int i=1;i<nrDiagonale;i++){
    positionArray += (dim-i-1); 
    		}
return matrix1D[(positionArray+positionInDiagonale)];
}

jetzt bastle ich mal weiter an der Anwendung, dann kann ich auch überprüfen, ob die gewünschten Ergebnisse geliefert werden :)

Vielen Dank für eure Hilfe!!!:applaus:
 

Gucky

Top Contributor
Eine Möglichkeit zum Abschätzen wäre die, dass du guckst, wie viel Speicher die JVM belegt, dann ein Array erzeugst und dann wieder nachguckst.
 

VM

Mitglied
Die Schleife die ich oben bastelt habe kann nicht funktionieren....

hier ist die, die zumindest auf dem Papier funktioniert :)

Java:
public double getKoeffizient1D(int n,int m){
	if (n<m){ return getKoeffizient1D(m, n);
	}
	 if (n==m){
	    	return matrix1D[n];
	    }
	 
    int positionInDiagonale = m;
    int nrDiagonale = n-m; //0 = Hauptdiagonale, 1 = erste Nebendiagonale usw.
    int positionArray=0;
   
    for (int i=0;i<nrDiagonale;i++){
    positionArray += (dim-i); 
    		}
return matrix1D[(positionArray+positionInDiagonale)];
}
	
}

@Gucky:
du guckst, wie viel Speicher die JVM belegt

gibt es dafür ein Tool, oder muss ich das aus dem Taskmanager/Aktivitätsanzeige auslesen?



Liebe Grüße und Danke an alle :) :) :)
 

Gucky

Top Contributor
Mit
Java:
Runtime rt = Runtime.getRuntime();
rt.gc(); //Bereinigung
System.out.println(rt.totalMemory() - rt.freeMemory()); //Ausgeben
bereinigst du den Speicher und gibst den aktuell belegten Speicher aus.

Der Unterschied zwischen dem ein- und dem zweidimensionalen Array wird gewaltig aussehen, da erstens beide Werte in Bytes ausgegeben werden und zum Zweiten ein 5x5 2D Array aus insgesamt 6 Arrays besteht. Aber dann musst du dir mal überlegen, wie viel das in Wirklichkeit ist. Nämlich nix ;)
 
Zuletzt bearbeitet:
Ähnliche Java Themen
  Titel Forum Antworten Datum
L Zweidimensionaler Array; n x m - Matrix überprüfuen Java Basics - Anfänger-Themen 35
C Matrix mit Array ausgeben Java Basics - Anfänger-Themen 6
U Dreiecks-Matrix mit Array Java Basics - Anfänger-Themen 3
Z Matrix Klasse mit Mehrdimensionalen Array (Addition, Multiplikation, to String) Java Basics - Anfänger-Themen 57
E 2D Array - char durch die Matrix "wandern" lassen Java Basics - Anfänger-Themen 7
H 2D Array, Symmetrische Matrix Java Basics - Anfänger-Themen 12
L Matrix(Array) minimieren... Java Basics - Anfänger-Themen 9
A daten vom 1d array in 2d matrix speichern Java Basics - Anfänger-Themen 3
E Array als Matrix Java Basics - Anfänger-Themen 21
Z mehrdimensionales Array, Matrix "invertieren" Java Basics - Anfänger-Themen 4
G Array ,Matrix Problem Java Basics - Anfänger-Themen 20
I matrix aufgabe Java Basics - Anfänger-Themen 22
idontknow707 Matrix nach z.B. Variable durchsuchen Java Basics - Anfänger-Themen 4
F Adjunkte Matrix erstellen Java Basics - Anfänger-Themen 3
M Matrix Java Basics - Anfänger-Themen 3
F Matrix Multiplikation Java Basics - Anfänger-Themen 3
B Dünn besetzte Matrix Java Basics - Anfänger-Themen 7
Al3xand3r01 Matrix, Nachbarelemente Java Basics - Anfänger-Themen 16
E Rückwärtsmultiplikation einer invertierten matrix Java Basics - Anfänger-Themen 2
M Matrix auf 4 Elemente untersuchen mit offenen Enden Java Basics - Anfänger-Themen 8
B Diskrete Faltung (Matrix) Randfälle Java Basics - Anfänger-Themen 8
M Matrix Elemente vergleichen Java Basics - Anfänger-Themen 11
N Quadratische Matrix inkl Summe Java Basics - Anfänger-Themen 8
J Methoden Moving a n integer matrix Java Basics - Anfänger-Themen 3
D Methoden Matrix Multiplikation Java Basics - Anfänger-Themen 27
O Matrix, Vektor Java Basics - Anfänger-Themen 9
S Matrix spaltenweise befüllen Java Basics - Anfänger-Themen 1
T Zufällige Matrix in neue Matrix schreiben Java Basics - Anfänger-Themen 6
C Matrix-Werte werden nicht wie erwartet ausgegeben Java Basics - Anfänger-Themen 7
C Matrix erstellen Spaltensumme, Zeilensumme, Diagonale Java Basics - Anfänger-Themen 1
S Methoden Transponierte Matrix Java Basics - Anfänger-Themen 3
N Vererbung Submatrix mit Verweis auf Matrix erstellen Java Basics - Anfänger-Themen 9
J Matrix erstellen Java Java Basics - Anfänger-Themen 7
B Transponiertes Matrix Java Basics - Anfänger-Themen 12
J Überprüfen, ob eine 2D Matrix ein Baum ist Java Basics - Anfänger-Themen 5
C Matrix transponieren - Hilfe Java Basics - Anfänger-Themen 1
D Ausgabe einer Matrix mit System.out.println Java Basics - Anfänger-Themen 6
T Art 4 Felder Matrix Memory Java Basics - Anfänger-Themen 2
U Ist diese Methode zur Matrix Vektor Multiplikation korrekt ? Java Basics - Anfänger-Themen 5
E Matrix mit Vektor multiplizieren Java Basics - Anfänger-Themen 7
S eingegebene Matrix anzeigen Java Basics - Anfänger-Themen 4
J Matrix für Schachbrett Java Basics - Anfänger-Themen 6
G tga Datei lesen und in eine matrix umwandeln Java Basics - Anfänger-Themen 1
G Bilddaten in Matrix umwandeln Java Basics - Anfänger-Themen 1
T Eine String Matrix erstellen die eine boolean Funtion verwendet Java Basics - Anfänger-Themen 10
O Matrix Multiplizieren Java Basics - Anfänger-Themen 4
S LWJGL - Matrix vom Matrixstack laden Java Basics - Anfänger-Themen 3
T Matrix auf Symmetrie überprüfen Java Basics - Anfänger-Themen 6
V Matrix Transponieren Java Basics - Anfänger-Themen 3
W Zweidimensionale Arrays als Matrix ausgeben Java Basics - Anfänger-Themen 8
R Matrix-Vektor-Multiplikation Java Basics - Anfänger-Themen 13
O Matrix ordnen Java Basics - Anfänger-Themen 4
M Symmetrische Matrix Java Basics - Anfänger-Themen 2
W Methoden Rang von einer Matrix mit Gauss Java Basics - Anfänger-Themen 0
U Matrix Subtrahieren Java Basics - Anfänger-Themen 12
E Input/Output convert string to two dimensional char and output = matrix Java Basics - Anfänger-Themen 2
I Matrix überprüfen Java Basics - Anfänger-Themen 8
Z Matrix mit Vektor multiplizieren Java Basics - Anfänger-Themen 13
K Methoden Einlesen einer unbegrenzten Matrix über Konsole Java Basics - Anfänger-Themen 6
O Einlesen einer Matrix von der Console Java Basics - Anfänger-Themen 18
N Matrix/Vektoren Java Basics - Anfänger-Themen 3
N Matrix Java Basics - Anfänger-Themen 14
T Methode, die eine 2 dimensionale Matrix kopiert. Java Basics - Anfänger-Themen 16
J Matrix Java Java Basics - Anfänger-Themen 3
D 2 mehrdimensionale Matrix einlesen Java Basics - Anfänger-Themen 2
A N*N Matrix Determinante berechnen Java Basics - Anfänger-Themen 47
K Quadratische Matrix um 90° drehen Java Basics - Anfänger-Themen 5
C Programm zur Berechnung der Spur einer Matrix Java Basics - Anfänger-Themen 4
B Zeilenumbruch (zweidim. Matrix) Java Basics - Anfänger-Themen 2
O Java Matrix mal Matrix über while Schleife... Java Basics - Anfänger-Themen 10
O Transponieren einer Matrix per While-Schleife Java Basics - Anfänger-Themen 3
M Matrix - Probelm Java Basics - Anfänger-Themen 7
O 2D Matrix befüllen mit geraden Zahlen!? Java Basics - Anfänger-Themen 14
J Java Matrix befüllen Java Basics - Anfänger-Themen 5
M Matrix Matrix Multiplikation Java Basics - Anfänger-Themen 6
F Matrix Java Basics - Anfänger-Themen 11
G OOP Parameter Matrix Java Basics - Anfänger-Themen 2
N Matrix Klasse Java Basics - Anfänger-Themen 4
B Maske an eine Matrix anpassen Java Basics - Anfänger-Themen 5
W Matrix übergeben Java Basics - Anfänger-Themen 7
T Matrix transponieren Java Basics - Anfänger-Themen 17
W Eine Methode schreiben, ob eine Matrix eine Diagonalmatrix ist.? Java Basics - Anfänger-Themen 3
M String Datei in Float-Matrix umwandeln Java Basics - Anfänger-Themen 8
D Problem: Werte eine Matrix vergleichen! Java Basics - Anfänger-Themen 5
B Matrix Java Basics - Anfänger-Themen 2
Semox Matrix multiplizieren Java Basics - Anfänger-Themen 4
N Matrix an toString Java Basics - Anfänger-Themen 7
C Diagonale in einem NxN Matrix Java Basics - Anfänger-Themen 6
F Einträgen von Matrix zu sotieren Java Basics - Anfänger-Themen 2
D JUnit auf Matrix anwenden Java Basics - Anfänger-Themen 5
J Spezielle Matrix ausgeben ! Java Basics - Anfänger-Themen 8
S Problem bei Matrix Addition Java Basics - Anfänger-Themen 5
F matrix werte übergeben Java Basics - Anfänger-Themen 5
M Hauptdiagonale Matrix berechnen Java Basics - Anfänger-Themen 6
M Klassenerstellung für Matrix mit Rechenopperationen Java Basics - Anfänger-Themen 42
D Matrix .bat datei erstellen und öffnen Java Basics - Anfänger-Themen 2
J Matrix ausgeben Java Basics - Anfänger-Themen 9
N Matrix Matrix Produkt Java Basics - Anfänger-Themen 7
N prüfe ob etwas in einer Matrix steht... Java Basics - Anfänger-Themen 14
L rechtecke zeichnen anhand von matrix Java Basics - Anfänger-Themen 27

Ähnliche Java Themen

Neue Themen


Oben