Sie sind nicht angemeldet.

Matt

Fuck me, I'm famous

  • »Matt« ist der Autor dieses Themas

Beiträge: 214

Wohnort: Nähe Bodensee

Beruf: Informatikkaufmann

Danksagungen: 6

  • Nachricht senden

1

21.12.2009, 14:52

JAVA: Hilfe bei Matrizen Addition und Multiplikation mit Methoden

Hi Leute,

hab hier ein kleines "Ich-steh-aufm-Schlauch" Problem.

Ich soll in einem Java Programm Matrizen mit vorher schon festgelegten Werten, z.B.

Quellcode

1
int[][] matrixA = {{5,4,1},{-3,1,3},{5,2,-3},{1,4,9}};

mit

Quellcode

1
int[][] matrixE = {{5,6,9},{13,9,7},{5,8,13},{9,6,1}};

addieren. Also

Quellcode

1
ergebnis[][] = matrixA[i][j] + matrixE[i][j]


Ich soll diese Vorgänge in Methoden unterbringen. Aber ich steh total auf dem Schlauch, wie ich das anstellen soll. Ich weiss nicht, wie ich zwei Matrizen in einer Methode die Vorgegebenen Werte zuweisen soll. Soll ich da vier for Schleifen nehmen? Und dann die Ergebnismatrix, wie soll ich dieser die Werte der Addition bzw. Multiplikation zuweisen? In einer 5. for Schleife? Welche Parameter soll im Methodenkopf stehen? Welchen return Wert? Weiß auch nicht was mit mir los ist. Ich stell euch mal die Aufgabenstellung (erste Seite, Aufgabe 5.1, (a) + (d)) rein, damit ihr wisst, von was ich spreche. So schwer kann das doch nicht sein!? So eine scheiss blöde Aufgabe....

Bitte hhelft mir! Bin am verzweifeln.... :( ;( ?(

dankee!!

Matt

Fuck me, I'm famous

  • »Matt« ist der Autor dieses Themas

Beiträge: 214

Wohnort: Nähe Bodensee

Beruf: Informatikkaufmann

Danksagungen: 6

  • Nachricht senden

2

21.12.2009, 17:05

Hmm..mittlerweile hab ich es geschafft die Rechnungen aufzustellen. Wobei er bei der Multiplikation mäckert. Keine Ahnung wieso....Weiss aber immer noch nicht, wie ich das alles in Methoden unterbringen soll....

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
class Matrix1 
{

	public static void main(String[] args) 
	{

	int[][] matrixA =	{{5,4,1},
				{-3,1,3},
				{5,2,-3},
				{1,4,9}};

	int[][] matrixB =	{{3,1,5,7},
				{-2,6,-3,1},
				{-3,2,1,9}};

	int[][] matrixE =	{{5,6,9},
				{13,9,7},
				{5,8,13},
				{9,6,1}};

	int[][] matrixF =	{{4,5,8},
				{12,8,6},
				{4,7,12},
				{8,5,0}};

//=============ADDITION, SUBTRAKTION & MULTIPLIKATION==============================================

//Initialisierung Addition, Subtraktion

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

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

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

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

	
//Addition, Subtraktion

int[][] ergebnis_plus = new int[4][3];
int[][] ergebnis_minus = new int[4][3];
int[][] ergebnis_multi = new int[3][3];

for(int i = 0; i<4; i++)
	for(int j=0;j<3; j++)
		ergebnis_plus[i][j] = matrixA[i][j] + matrixE[i][j];

for(int i = 0; i<4; i++)
	for(int j=0;j<3; j++)
		ergebnis_minus[i][j] = matrixE[i][j] - matrixF[i][j];

for(int i = 0; i<3; i++)
	for(int j=0;j<matrixB.length; j++)
		for(int k = 0; k<matrixA[0].length;k++)
			ergebnis_multi[i][k] = matrixA[i][j] * matrixB[i][k];



//Ausgabe ergebnis_plusMinusMulti:

for(int i=0; i<4; i++)
{
	for(int j=0; j<3; j++)
		System.out.print(ergebnis_plus[i][j] + "  ");
	System.out.println("");
}
System.out.println();
for(int i=0; i<4; i++)
{
	for(int j=0; j<3; j++)
		System.out.print(ergebnis_minus[i][j] + "  ");
	System.out.println("");
}
System.out.println();
for(int i=0; i<4; i++)
{
	for(int j=0; j<3; j++)
		System.out.print(ergebnis_multi[i][j] + "  ");
	System.out.println("");
}//=================================================================================	


	


	}//Ende Main()

} //Ende Klasse

turbo

Schüler

Beiträge: 142

  • Nachricht senden

3

25.12.2009, 02:59

muss mir das morgen mal in ruhe ansehen. stell doch aber bitte mal hier rein, was der fehler/die fehlermeldung bei der multiplikation ist.

Werbung

Beiträge: 63

  • Nachricht senden

4

25.12.2009, 10:26

mal ne frage? was ist das für ne matrixmultiplikation? Du multiplizierst ja nur komponentenweise, das ist im allgemeinen nicht richtig. Jedenfalls lese ich das daraus :)
Ich würd das ganze übrigens methodischer aufbauen. Die Matrizen A,B usw sollen ja nur Beispiel matrizen sein.
Ich vermisse halt eine Methode matrixmult der du 2 matrizen übergibst und die gibt dir dann eine Matrix aus.
Du solltest evtl auch erstmal ein Objekt Matrix definieren mit dem du auf die einzelnen Einträge zugreifen kannst etc. Stichwort z.B Kapselung
Dann könntest du eine Multiplikation für eine Matrix A auch durch A.matrixmult(B) durchführen ;)
Bin was das Programmieren angeht ein bisschen raus, sorry;) Aber ich würde nen objektorientierteren Ansatz wählen.

Ach ja wenn du A*B rechnest kann das nicht gehen, da die Unterschiedliche Dimensionen haben. A hat kein Feld(3,0) und B hat kein Feld (0,3).
Wenn ichs jetzt richtig sehe ;)

Matt

Fuck me, I'm famous

  • »Matt« ist der Autor dieses Themas

Beiträge: 214

Wohnort: Nähe Bodensee

Beruf: Informatikkaufmann

Danksagungen: 6

  • Nachricht senden

5

25.12.2009, 10:35

Danke für eue Antworten.

Doch, die MAtrizen A und B sind Multiplizierbar, die Zeilenzahl von Matrix A stimmt mit der Spaltenzahl von Matrix B überein. So stehts mal in der Aufgabe.

@ Turbo: Wenn du das Programm so ausführst, dann Wir eben ein falsches Ergebnis ausgegeben. Die Lösung steht im Aufgabenblatt auf Seite 1. Ich stelle später mal ne Überarbeitete Version rein.

@ Quick: Das ist ja das Problem ich weiß nicht genau wie ich das mit Methoden lösen soll, komme da momentan noch durcheinander mit den Parametern, Rückgabewerten und Ausgabemethoden.

Beiträge: 63

  • Nachricht senden

6

25.12.2009, 10:47

@ matt, natürlich hast du recht :) die matrizen sind multiplizierbar ;) ich dachte irgendwie an quadtratische matrizen.
Aber bei Multiplikation von matrizen muss man auch addieren, das fehlt gänzlich. Deshalb das falsche Ergebnis!

Ich glaube dein Problem ist, dass du zu viel in die Klasse Matrix packen möchtest.
Die Klasse Matrix sollte eigentlich nichts mit der Ausgabe zu tun haben.
Da sollteste eine andere Klasse z.B MarixAusgabe erstellen wo dann Konkret Objekte initialisiert und Berechnungen durchgeführt werden.
Wie z.B hier http://michael.hahsler.net/JAVA/pdf/03_3Methoden.pdf seite 7
Bei dir wäre die Klasse dann halt Matrix mit public int[][] irgendein name
Auch Seite15: Konstruktoren ist lesenwert --> so wirds dann Objektorientierter ;)

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Quickbeam2k1« (25.12.2009, 10:54)


Werbung

turbo

Schüler

Beiträge: 142

  • Nachricht senden

7

25.12.2009, 12:26

ungetesteter code einer beispielhaften matrix-klasse:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
public class Matrix {
	private double[][] data;
	private int rows;
	private int lines;
	public Matrix(double[][] in){
		data = in;
		lines = data.length;
		rows = data[0].length;
	};
	double get(int a, int b){
		return this.data[a][b];
	}
	private void set(int a, int b, double in){
		this.data[a][b]= in;
	}
	public int lines(){
		return this.lines;
	}
	public int rows(){
		return this.rows;
	}
	public Matrix matrixAdd(Matrix that){
		if(!(this.lines() == that.lines() && this.rows() == that.rows())){
			throw new IllegalArgumentException("Folgende Bedingung wurde verletzt: this.lines == that.lines und this.rows == that.rows");
		}
		Matrix result = new Matrix(new double[this.lines()][this.rows()]);
		for(int i = 0; i < this.lines(); i++){
			for(int j = 0; j < this.rows(); j++){
				result.set(i, j, (this.get(i, j) + that.get(i, j))) ;
			}
		}
		return result;
	};
	public Matrix matrixMul(Matrix that){
		if(!(this.lines() == that.rows() && this.rows() == that.lines())){
			throw new IllegalArgumentException("Folgende Bedingung wurde verletzt: this.lines == that.rows und this.rows == that.lines");
		}
		Matrix result = new Matrix(new double[this.lines()][that.rows()]);
		// hier berechnung der einzelnen matrixelemente
		
		return result;
	};
}

rechne am besten mit fehlern ;) bei der multiplikation fehlt nach die berechnung der daten. wie diese in die matrix "result" kommen, siehst du bei der addition.

edit: code noch mal etwas verbessert (hoffentlich)

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »turbo« (25.12.2009, 17:07)


Matt

Fuck me, I'm famous

  • »Matt« ist der Autor dieses Themas

Beiträge: 214

Wohnort: Nähe Bodensee

Beruf: Informatikkaufmann

Danksagungen: 6

  • Nachricht senden

8

25.12.2009, 12:47

Turbo, ich verstehe fast nichts von deinem Code! :D Das ist wohl die Lösung die man von einem 6. Semestler erwarten würde! ;) Aber wenn ich meine Lösung so anpassen würde, würde es mir keiner glauben, dass der Code von mir ist (1. Semester) :D
Ich danke dir, dass du dir die Mühe gemacht hast. Ich werde deinen Code auf jeden Fall studieren. Weil ich grad genau bei diesem Thema bin und ich über jeden Nachvollziehbaren Code freue.

@Quick: Die Lösung sollte in einer Klasse stehen. Ich danke auch dir für den Link. Leider haben wir Objekte noch nicht behandelt. Das würde jetzt zuweit vorgreifen, bin da grade noch am lernen, wie das genau geht mit den Objekten und so. OOP ist manchmal echt dämlich abstrakt kompliziert ;)

turbo

Schüler

Beiträge: 142

  • Nachricht senden

9

25.12.2009, 13:22

ach du grüne neune!
ihr hattet noch keine objekte? Oo
z.z. ist in meinem code noch der wurm drin. er addiert nicht. :-/ sehe den fehler aber gerade nicht.

zu deinem problem:
anstatt alle berechnungen direkt in der main zu machen, solltest du zusätzliche methoden schreiben, die das machen also z.b.

Quellcode

1
2
3
4
5
6
7
8
9
static double[][] add(double[][] a, double[][]b){
		double[][] result = new double[a.length][a[0].length];
		for(int i = 0; i < a.length; i++){
			for(int j = 0; j < a[0].length; j++){
				result[i][j] = (a[i][j] + b[i][j]);
			}
		}
		return result;
	};
diese methoden rufst du dann aus der main heraus auf.

kann mir jemand verraten, warum bei mir immer nur nullen in der ergebnis-matrizen stehen? ?(

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »turbo« (25.12.2009, 17:06)


Werbung

Beiträge: 63

  • Nachricht senden

10

25.12.2009, 17:01

j > this.rows ist komisch, oder?

Zeile 28, hmm naja also wir haben im Nebenfach damals Objekte schon recht früh gelernt, wobei ich sagen muss dass ich das Konzept erst richtig nach der Vorlesung Softwaretechnik verstanden hab. Und eigentlich ist es gar nicht kompliziert sondern sogar eher die natürliche Vorgehensweise ;)

turbo

Schüler

Beiträge: 142

  • Nachricht senden

11

25.12.2009, 17:07

ARGH!
danke, quickbeam!
blöder tippfehler

Beiträge: 63

  • Nachricht senden

12

28.12.2009, 12:22

hast dus nun hinbekommen? Falls nicht schau dir noch mal den Algorithmus zur Matrixmultiplikation an. Es ist keien Komponentenweise Multiplikation! Wie auch, die Matrizen liegen ja in unterschieldichen Räumen.

Hier die stelle:
for(int i = 0; i<3; i++)
for(int j=0;j<matrixB.length; j++)
for(int k = 0; k<matrixA[0].length;k++)
ergebnis_multi[k] = matrixA[i][j] * matrixB[i][k];
und da muss halt noch ne summation irgendwie rein :)

Werbung

Lesezeichen:

Forenuser - Die Foren
Findmaschine