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

eisenmad

Treue Seele

  • »eisenmad« ist der Autor dieses Themas

Beiträge: 84

Wohnort: Heute hier, morgen dort

Beruf: Denker

  • Private Nachricht senden

1

13.11.2015, 16:26

Fallunterscheidungen Matrix und Skalarprodukt

Hallo

Ich habe eine Matrix A mit m Zeilen und n Spalten, sowie eine Matrix B mit p Zeilen und n+1 Spalten, ferner ist p größer als m. In der A Matrix sind alle Koeffizienten binäre, also 0 oder 1. In der B Matrix ist die erste Spalte eine natürliche Zahl zwischen 0 und m (das gleiche m wie die Zeilenzahl von A) und die restlichen n Spalten sind hier ebenfalls binär. Die natürlichen Zahlen in der ersten Spalten kommen mehrfach vor.

Hier ein Beispiel wie die Matrizen aussehen können:

A-Marix:
0 0 0
1 1 0
0 0 1
1 1 1

B-Marix:
1 0 0 0
2 1 0 0
2 0 1 0
2 1 1 0
3 0 0 1
4 1 0 1
4 0 1 1
4 1 1 1

Mein Ziel ist nun das Skalarprodukt von jedem (binären!) Zeilenvekor aus B (also ohne die erste Spalte) mit demjenigen Zeilenvektor aus A zu berechnen, dessen Zeilenindex gegeben ist durch die natürliche Zahl aus der ersten Spalte der B-Matrix.

Im Beispiel:
(0 0 0) aus A multipliziert mit (0 0 0) aus B, weil die 1 in der ersten Spalte in der ersten Zeile nur einmal vorkommt. Dann (1 0 0) mal (1 1 0) sowie (0 1 0) mal (1 1 0) und (1 1 0) mal (1 1 0) weil die Zwei in drei Zeilen von B steht und diese Zwei den zweiten Zeilenvektor aus A repräsentiert. Dann das selbe Vorgehen einmal für die Drei und zuletzt Drei mal für die Vier.

Am Ende möchte ich so eine (m x p)-Matrix C erhalten, in der alle diese Skalarprodukte stehen.

Mein Hauptproblem ist nun, dass ich konzeptionell nicht weiss wie so etwas zu programmieren ist. Von Hand ist ganz klar was ich meine und wie das geht, aber wie programmiert man das?

Danke für die Hilfe und Grüße

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

2

13.11.2015, 16:56

Schreib doch mal Schritt für Schritt auf wie du von Hand vorgehen würdest. Nicht so oberflächlich und kurzgefasst wie du es schon getan hast sondern ausführlicher. Nicht weil ich dich nicht verstehe, deine Ausführung war fürs Verständnis gut genug, aber dabei wirst du denke ich merken dass du das ganze fast 1 zu 1 so nachprogrammieren kannst. Wenn du es aufschreibst siehst du es vielleicht selbst. Ansonsten schreib es ruhig mal hier in den Thread. Wenn du dann deine Schritt für Schritt Anleitung aufgeschrieben hast überlegst du dir wie du jeden dieser Schritte in Code übersetzen könnte. Dann können wir hier auch gerne weiter zusammen überlegen. Aber vielleicht müssen wir das dann schon gar nicht mehr.
Du kannst diese Schritt für Schrittanleitung auch theoretisch am Beispiel welches du unten gewählt hast machen. Beschreibe einfach genau was du machen würdest wenn du das jetzt von Hand ausrechnen würdest. Dabei wirst du vermutlich merken dass du dich oft wiederholen musst. Das sind dann potentielle Dinge die in Funktionen zusammen gefasst werden möchten.
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

Tobiking

1x Rätselkönig

  • Private Nachricht senden

3

13.11.2015, 17:09

Mein Ziel ist nun das Skalarprodukt von jedem (binären!) Zeilenvekor aus B (also ohne die erste Spalte) mit demjenigen Zeilenvektor aus A zu berechnen, dessen Zeilenindex gegeben ist durch die natürliche Zahl aus der ersten Spalte der B-Matrix.

Die Beschreibung ist bereits ziemlich nah an einer Möglichen Programmumsetzung:

Für jede Zeile Z1 aus B
Hole die Z1[0]-te Zeile Z2 aus A
Skalarprodukt

Wenn du dir jetzt noch das Skalarprodukt in Einzelschritte zerlegst (oder als Summenschreibweise) hast du alles was du für das Programm brauchst.

eisenmad

Treue Seele

  • »eisenmad« ist der Autor dieses Themas

Beiträge: 84

Wohnort: Heute hier, morgen dort

Beruf: Denker

  • Private Nachricht senden

4

15.11.2015, 12:34

Hallo

Erstmal Danke für die Antworten. Das Problem ist, dass A und B unterschiedliche Spaltenzahlen haben. Somit weiss ich nicht wie die Aufsummierung funktionieren soll. Für das Beispiel aus meinem Eingangspost habe ich diesen Code soweit:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
int summe;
for(ik=0; ik< 4; ++ik)
{
  for(im=0; im<8; ++im)
  {
   for(il=0 für A und il=1 für B; il< 3 für A und il < 4 für B; ++il) //Hier ist mein Problem
   {
       summe=A[ik][il]*B[A_ZeilenindexIndex[im]][il];
       SKP_AB[ik][im]+=summe;
   }
  }
}


Wie könnte ich dieses Problem lösen?

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

5

15.11.2015, 12:38

Nunja, die innerste Schleife macht drei Durchläufe; die entsprechenden Indices für A und für B in jedem Durchlauf kannst du ja ganz einfach ausrechnen!?

eisenmad

Treue Seele

  • »eisenmad« ist der Autor dieses Themas

Beiträge: 84

Wohnort: Heute hier, morgen dort

Beruf: Denker

  • Private Nachricht senden

6

15.11.2015, 12:46

Meinst du so etwas in der Art? Da kommt aber auch keine sinnvolle Ausgabe heraus. Oder meinst du, dass A und B jeweils eine eigene Variable für den Spaltenindex bekommen?

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
int summe;
for(ik=0; ik< 4; ++ik)
{
  for(im=0; im<8; ++im)
  {
   for(il=1; il<4; ++il)
   {
   for(il=0; il< 3; ++il) 
   {
       summe=A[ik][il]*B[A_ZeilenindexIndex[im]][il];
       SKP_AB[ik][im]+=summe;
   }
   }
  }
}

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

7

15.11.2015, 12:58

Um, nein, das meinte ich nicht. Was genau denkst du, soll das tun!?

eisenmad

Treue Seele

  • »eisenmad« ist der Autor dieses Themas

Beiträge: 84

Wohnort: Heute hier, morgen dort

Beruf: Denker

  • Private Nachricht senden

8

15.11.2015, 13:32

Ich steig da nicht dahinter. Folgendes ist immer noch falsch

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
for(ik=0; ik< 4; ++ik)
{
  for(im=0; im<8; ++im)
  {   
   for(il=0; il<3; ++il)
   {
       summe=A[ik][il]*B[A_ZeilenIndex[im]][il+1];
       SKP_AB[ik][im]+=summe;
   }
  }
}


Irgendwo mache ich einen groben Denkfehler :(

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

9

15.11.2015, 13:35

Das sieht mir schon besser aus. Inwiefern ist es denn falsch? Schonmal mit Debuggen versucht?

eisenmad

Treue Seele

  • »eisenmad« ist der Autor dieses Themas

Beiträge: 84

Wohnort: Heute hier, morgen dort

Beruf: Denker

  • Private Nachricht senden

10

15.11.2015, 13:38

Beim compilieren und ausführen erhalte ich keinen Fehler, aber die Ausgabe der SKP_AB Matrix die ich berechne ist unsinnigö. Das Ergebnis ist:

0 0 0 0 0 0 0 0
1 1 1 1 2 0 0 0
0 0 0 0 0 1 1 1
1 1 1 1 2 1 1 1

Was überhaupt nicht stimmen kann :(

Werbeanzeige