2016-05-03 15 views
1

Als eine Übung soll ich eine Funktion schreiben, die zwei Matrizen multiplizieren kann, vorausgesetzt, dass Sie eine bestimmte Eingabe angeben. Die Art, wie die Übung geschrieben wird, sollte folgende Form haben:Schreibe Funktion, um Matrizen in C++ zu multiplizieren

void Multiply(double **res, double **A, double **B, int ARows, int ACols, int BRows, int BCols);   

Hier wird das Ergebnis der Multiplikation in res geschrieben. Ich bin mir nicht sicher, ob ich die obige Form verstehe. Soweit ich das verstehe, werden die Adressen zweier Matrizen und die Anzahl ihrer Spalten und Zeilen als Eingabe genommen. Aber was sollte die Eingabe von res sein (was ist das Ergebnis der Multiplikation der Matrizen)? Sollte es die Adresse einer vorbelegten Matrix mit den richtigen Dimensionen sein? In diesem Fall habe ich die folgende Funktion zu testen (I auch Matrix A und B angegeben):

double** C; 
C = new double [rows]; 
for (int i=0; i<rows; i++) 
{ 
C[i] = new double [cols]; 
} 
std::cout << Multiply(&C,&A,&B,Arows,Acols,Brows,Bcols) << "\n"; 
} 

Aber ich glaube nicht, das ist richtig. Hier ist mein Code für mehrfach:

void Multiply(double **res, double **A, double **B, int ARows, int  ACols, int BRows, int BCols) 
{ 
    assert(ACols=BRows); 
    for (int k=0; k<BCols; k++) 
    { 
     for (int j=0; j<ARows; j++) 
     { 
      for (int i=0; i<ACols; i++) 
      { 
       res[j][k] += A[j][i]*B[i][k]; 
      } 
     } 
    } 
} 

Test für Multiply:

int main() 
{ 
    int ARows = 2; 
    int ACols = 3; 
    int BRows = 3; 
    int BCols = 2; 
    int cols = ARows; 
    int rows = BCols; 
    double** A; 
    A = new double* [ARows]; 
    for (int i=0; i<ARows; i++) 
    { 
     A[i] = new double [ACols]; 
    } 
    double** B; 
    B = new double* [BRows]; 
    for (int i=0; i<BRows; i++) 
    { 
     B[i] = new double [BCols]; 
    } 
    A[0][0]=1; 
    A[0][1]=2; 
    A[0][2]=3; 
    A[1][0]=4; 
    A[1][1]=6; 
    A[1][2]=10; 
    B[0][0]=1; 
    B[0][1]=2; 
    B[1][0]=4; 
    B[1][1]=6; 
    B[2][0]=13; 
    B[2][1]=9; 
    double** C; 
    C = new double* [rows]; 
    for (int i=0; i<rows; i++) 
    { 
     C[i] = new double [cols]; 
    } 
    std::cout << Multiply(C,A,B,ARows,ACols,BRows,BCols) << "\n"; 
} 
+1

Wie Multiply erwartet ein 'Doppel **' 'für res' und als 'C' ist bereits ein' Doppel ** ', gibt es keine Notwendigkeit' & C' an die Funktion übergeben. Das einfache "C" ist ausreichend. Da es bereits ein Zeiger ist, kann die Funktion den angegebenen Inhalt füllen. –

Antwort

2

&C, &A, &B Dadurch wird die Adresse geben, dass der Doppelzeiger Zeiger bei gespeichert. Dies würde bedeuten, dass Multiply würde double***: ein Zeiger auf einen double** Typ. Sie können übergeben Sie es genauso

std::cout << Multiply(C,A,B,Arows,Acols,Brows,Bcols) << "\n"; 

Welche drei double** Arten passieren wird, nämlich A, B und C.

Auch die Art, wie Sie new für C verwenden, ist falsch. Sie müssen

verwenden

Sie versuchen auch, eine Void-Funktion zu drucken, die nicht funktionieren wird. Multiplizieren ist nicht etwas, das Sie drucken können, Sie müssen es so nennen, dass C definiert ist. Dann müssen Sie C manuell durchlaufen und ausgeben. Ich habe den Code unten geschrieben.

#include <iostream> 

void Multiply(double **res, double **A, double **B, int aRows, int aCols, int bRows, int bCols) 
{ 
    if (aCols != bRows) 
     return; 

    for (int i = 0; i < aRows; i++) 
    { 
     for (int j = 0; j < bCols; j++) 
     { 
      res[i][j] = 0; 
      for (int k = 0; k < aCols; k++) 
      { 
       res[i][j] += A[i][k]*B[k][j]; 
      } 
     } 
    } 
} 

void Initialise(double **res, int rows, int cols) 
{ 
    for (int i = 0; i < rows; i++) 
    { 
     for(int j = 0; j < cols; j++) 
     { 
      res[i][j] = i*j; // whatever you want. 
     } 
    } 
} 

int main() 
{ 
    int aRows = 10; 
    int aCols = 5; 
    int bRows = 5; 
    int bCols = 6; 

    double** A = new double*[aRows]; 
    for (int i = 0; i < aRows; i++) 
    { 
     A[i] = new double[aCols]; 
    } 

    double** B = new double*[bRows]; 
    for (int i = 0; i < bRows; i++) 
    { 
     B[i] = new double[bCols]; 
    } 

    Initialise(A, aRows, aCols); 
    Initialise(B, bRows, bCols); 

    double** C; 
    C = new double*[aRows]; 
    for (int i = 0; i < aRows; i++) 
    { 
     C[i] = new double [bCols]; 
    } 

    Multiply(C,A,B,aRows,aCols,bRows,bCols); 

    for (int i = 0; i < aRows; i++) 
    { 
     for (int j = 0; j < bCols; j++) 
     { 
      std::cout << C[i][j] << ' '; 
     } 
     std::cout << '\n'; 
    } 

    return 0; 
} 
+0

Diese verwenden zwar dynamischen Speicher, müssen also nicht als Referenz übergeben werden. – mojo1mojo2

+0

Ich habe versucht, Multiply unten zu definieren, aber ich bin mir nicht sicher, wie ich A und B nennen sollte. Da sie nun Doppelzeiger sind, kann ich einfach schreiben A [i] [j] oder sollte ich schreiben ** A [i] [j ]? Ich bekomme ein paar seltsame Fehler beim Kompilieren. Ich habe meinen Code für Multiply im OP eingefügt. – user13514

+0

Brauchen Sie C = neue Doppel * [Zeilen]; – mojo1mojo2

Verwandte Themen