Matrix einlesen für Matrix-Vektor-Multiplikation



  • Hallo,

    ich will eine Matrix - Vektor - Multiplikation realisieren. An einer Stelle komme ich nicht weiter, und zwar da wo die Matrix eingelesen werden soll,
    Ich habe zuerst folgende Variablen deklariert:

    int i,j,k,m,n;	//Variablen
    int *a,*b,*c;	//Zeiger auf die Felder
    

    Nach Eingabe der Spalten- und Zeilenanzahl habe ich mittels dynamischer Feldvereinbarung die Größe festgelegt:

    a=(int*)malloc(m*n*sizeof(int));	//Speicherplatz für a,b,c reservieren
    b=(int*)malloc(n*sizeof(int));		//a-Zeilen, b-Spalten, c-Vektor
    c=(int*)malloc(m*sizeof(int));		//a: Matrix
    

    Jetzt habe ich eine Lösung gefunden um die Matrix einzulesen, die auch funktioniert. Ich versteh Sie nicht so ganz:

    for(i=0;i<m;i++)		//Zeile 0 bis m
    	{
    		printf("\n%d. Zeile",i+1);
    		for(j=0;j<n;j++)		//Element 0 bis n (Spalte)
    		{
    			printf("%d. Element: ",j+1);
    			scanf("%d",&a[i*n+j]);
    		}
    	}
    

    Für mich wäre folgendes logisch:

    for(i=0;i<m;i++)		//Zeile 0 bis m
    	{
    		printf("\n%d. Zeile",i+1);
    		for(j=0;j<n;j++)		//Element 0 bis n (Spalte)
    		{
    			printf("%d. Element: ",j+1);
    			scanf("%d",&a[i][j]);  // <--- diese Stelle
    		}
    	}
    

    Kann mir das jemand von Euch erklären? Vielen Dank schonmal...

    Viele Grüße
    Christian



  • Hallo,

    mit deiner Allokierung

    a=(int*)malloc(m*n*sizeof(int));
    

    erstellst du einen 1 Dimensionalen Array. Deswegen auch nur einmal die [] und nicht zweimal.



  • Danke für die Antwort. Ist es auch möglich Speicherplatz für ein mehrdimensionales Feld zu reservieren? Das wäre für mich logischer. Ich versteh nämlich nicht so ganz dieses

    scanf("%d",&a[i*n+j]);
    

    Wieso i*n+j?
    Verstehe ich es richtig dass hier alle Zeilen hintereinander in einem eindimensionalen Feld abgelegt sind?

    Viele Grüße
    Christian



  • So ungefähr müßte das IMHO für ein 2-dim. Feld aussehen:

    int i;
    double **A;
    A = (double **)calloc(m, sizeof(double *));
    for( i=0;i<m;i++ )
      A[i] = (double *)calloc (n, sizeof(double));
    

    Wobei m Zeilenanzahl, n Spaltenanzahl...

    Speicherplatz freigeben:

    int i;
    for( i=0;i<m;i++ )
      free (A[i]);
    free (A);
    

Anmelden zum Antworten