Matrixmultiplikation
-
Count_Omega schrieb:
std::cout << Em[zeilenmc][spaltenmc] << endl;Das gibt das Element (und nur dieses eine Element) Em[1000][1000] des Arrays Em aus. (bei deinen Parametern)
Nach deiner Definition existiert das Element aber gar nicht.
-
Ich habe den Code nochmals überprüft und jetzt kompiliert es. Beim Ausführen bekomme ich jedoch den error Speicherzugriffsfehler (Speicherabzug geschrieben).
Dies liegt vermutlich an den Arrraygrenzen; wenn ich diese dynamisch festlegen will funktioniert es nicht.#include <iostream> #define size 100 using namespace std; void matrixmult(int Ma[size][size],int Mb[size][size], int zeilenmc, int spaltenmc, int zeilenmb); int main(int argc, char **argv) { int z = 100; int z1 = 100; int z2 = 100; int m1[100][100]; int m2[100][100]; matrixmult(m1, m2, z, z1, z2); } void matrixmult(int Ma[size][size], int Mb[size][size], int zeilenmc, int spaltenmc, int zeilenmb) { int Em[100][100] = { 0 }; for (int i = 0; i< zeilenmc; ++i) { for (int j = 0; j < zeilenmb; ++j) { for (int k = 0; k < spaltenmc; ++k) { Em[i][k] = Ma[i][j] * Mb[j][k]; } } } std::cout << Em[zeilenmc][spaltenmc] << endl; }
-
Count_Omega schrieb:
#include <iostream> #define size 100 //? using namespace std; void matrixmult(int Ma[size][size],int Mb[size][size], int zeilenmc, int spaltenmc, int zeilenmb); //int main(int argc, char **argv) int main() { int z = 100; int z1 = 100; int z2 = 100; int m1[100][100]; int m2[100][100]; matrixmult(m1, m2, z, z1, z2); } void matrixmult(int Ma[size][size], int Mb[size][size], int zeilenmc, int spaltenmc, int zeilenmb) { int Em[100][100] = { 0 }; for (int i = 0; i< zeilenmc; ++i) { for (int j = 0; j < zeilenmb; ++j) { for (int k = 0; k < spaltenmc; ++k) { Em[i][k] = Ma[i][j] * Mb[j][k]; //ist auch noch immer falsch. } } } std::cout << Em[zeilenmc][spaltenmc] << endl; }Beim Ausführen bekomme ich jedoch den Fehler Speicherzugriffsfehler (Speicherabzug geschrieben).
DirkB schrieb:
Count_Omega schrieb:
std::cout << Em[zeilenmc][spaltenmc] << endl;Das gibt das Element (und nur dieses eine Element) Em[1000][1000] des Arrays Em aus. (bei deinen Parametern)
Nach deiner Definition existiert das Element aber gar nicht.scheinst ein bisschen auf kriegsfuß mit lesen zu stehen?
-
ist es dann richtig mit
... Em[i][k] += Ma[i][j] * Mb[j][k]; ... for (int l = 0; l > size; ++l) { for (int m = 0; m > size; ++m) { std::cout << Em[l][m] << endl; } }
-
Nein. Denn < und > solltest du besser nicht verwechseln (2x).
Du kannst nicht einfach irgendwelche Zeichen wie *, +, <, =, > raten, sondern musst überlegen, welches jeweils passt! (ok, du kannst schon raten, aber dann ist es Glückssache, ob es richtig wird)
-
Hat sich erledigt, fuktioniert. Trotzdem vielen Dank. Code:
#include <iostream> #define size 100 using namespace std; void matrixmult(int Ma[size][size],int Mb[size][size], int zeilenmc, int spaltenmc, int zeilenmb); int main(int argc, char **argv) { int z = 100; int z1 = 100; int z2 = 100; int m1[100][100]; int m2[100][100]; matrixmult(m1, m2, z, z1, z2); } void matrixmult(int Ma[size][size], int Mb[size][size], int zeilenmc, int spaltenmc, int zeilenmb) { int Em[100][100] = { 0 }; for (int i = 0; i< zeilenmc; ++i) { for (int j = 0; j < zeilenmb; ++j) { for (int k = 0; k < spaltenmc; ++k) { Em[i][k] = Ma[i][j] * Mb[j][k]; } } } for (int l = 0; l < size; ++l) { for (int m = 0; m < size; ++m) { std::cout << Em[l][m] << endl; } } }Die Matrizen müssen noch gefüllt werden,aber das ist nebensächlich.
-
Count_Omega schrieb:
Hat sich erledigt, fuktioniert.
Em[i][k] = Ma[i][j] * Mb[j][k];Wetten nicht? Matrizenmultiplikation geht anders.

-
Ist eine zufallige Arrayfüllung so zulässsig?
... m1[size][size]; srand((unsigned)time(NULL)); for (int i = 1; i < 100; i++) { for (int j = 1; i < 100; j++) { m1[i][j] = rand() % 100; } }
-
Es scheint zu funktionieren:
#include <iostream> #include <ctime> #include <cstdlib> #define size 10 using namespace std; void matrixmult(int Ma[size][size],int Mb[size][size], int zeilenmc, int spaltenmc, int zeilenmb); int main(int argc, char **argv) { int z = 10; int z1 = 10; int z2 = 10; int m1[10][10]; int m2[10][10]; srand((unsigned)time(NULL)); for (int i = 1; i < 10; i++) { for (int j = 1; j < 10; j++) { m1[i][j] = rand() % 10; } } srand((unsigned)time(NULL)); for (int i = 1; i < 10; i++) { for (int j = 1; j < 10; j++) { m2[i][j] = rand() % 10; } } matrixmult(m1, m2, z, z1, z2); } void matrixmult(int Ma[size][size], int Mb[size][size], int zeilenmc, int spaltenmc, int zeilenmb) { int Em[10][10] = { 0 }; for (int i = 0; i< zeilenmc; ++i) { for (int j = 0; j < zeilenmb; ++j) { for (int k = 0; k < spaltenmc; ++k) { Em[i][k] += Ma[i][j] * Mb[j][k]; } } } std::cout << "Endmatrix: " << "["; for (int l = 0; l < size; ++l) { for (int m = 0; m < size; ++m) { std::cout << Em[l][m] << " " ; } } std::cout << "]" << endl; }Ist die Matrixfüllung wirklich zufällig?
-
Liest du eigentlich zu irgendeiner Funktion, die du benutzt, auch mal die Dokumentation?
Preisfrage: wie oft soll man srand in einem Programm aufrufen?
Versuch doch mal als ersten Test, irgendeine Matrix mit zu multiplizieren.
(abgesehen davon, dass du hier im C++-Forum postest und du somit besser std::random_device und/oder std::mt19937 nutzen solltest - was hier aber aufgrund der anderen Dinge ziemlich irrelevant ist)