Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 15

Discussione: [c++]Matrici

  1. #1

    [c++]Matrici

    calcolare il determinante di matrici n*n!!

  2. #2
    prova con questo:

    codice:
    #define DIM 3
    void main()
    {
    	int m[DIM][DIM];  // definisci tu i valori della matrice
    
    	int diaForward=1, diaBack=1;
    	int det=0;
    
          // popola la matrice
    
    		for (int i=0; i<DIM; i++)
                        {
    		for (int j=0; j<DIM; j++)
    			{
    			diaBack *= m[j][j+i<DIM ? j+i : j+i-DIM];
    			diaForward *= m[j][DIM-j-1-i>=0 ? DIM-j-1-i : 2*DIM-j-i-1];
    		}
    		det+=diaBack-diaForward;
    		diaForward = diaBack = 1;
    }
    printf("\n%d\n", det);
    }
    dA .. foto di viaggio
    L'esperienza č il tipo di insegnante pių difficile.
    Prima ti fa l'esame, e poi ti spiega la lezione.

  3. #3

    [c++]spiegazioni programma

    potresti scrivere anche un commento su quello che mi hai mandato?

  4. #4
    Meglio di no.
    Per sicurezza sono andato a controllare, ma il metodo che ho utilizzato credo valga solamente per matrici 3x3. Quindi non fa al caso tuo.

    cmq mō controllo meglio!
    dA .. foto di viaggio
    L'esperienza č il tipo di insegnante pių difficile.
    Prima ti fa l'esame, e poi ti spiega la lezione.

  5. #5
    Utente di HTML.it L'avatar di Xadoom
    Registrato dal
    Dec 2002
    Messaggi
    1,491
    Per matrici nxn credo tu debba andarti a calcolare i complementi algebrici....reminescenze di algebra lineare....ma forse credo proprio ci siano algoritmi giā implementati...provato una ricerca sul forum?
    Windows Xp
    [Java]
    [PHP]Notepad++
    [Fortran90-77] elf90 g77
    [C++ /WinAPI] DevC++ VisualC++

  6. #6

    [c++]new matrici

    consultando il libro di geometria ho trovato la formula di determinante di matrici n*n :
    La sommatoria per j che parte da 1 a n di (a(1j)*A(1j)) per n>=2.
    Chi ha confidenza con matrici di 3*3 capira' sicuramente questa formula altrimenti basta scrivere su un motore di ricerca determinante matrici n*n!!!

  7. #7
    Allora innanzitutto premetto che il codice "dovrebbe" funzionare, ma ovvio che i test li ho fatti solo su 2 matrici una 4x4 e una 5x5 generata da quella 4x4. Quindi non prometto nulla. Se hai esercizi con risultato di matrici con n>3 puoi verificare

    Seconda cosa il codice accetta matrici con n>=1.

    @xadoom: non volevo cercare uno script giā fatto, se no dove sta il gusto


    ecco il codice. Ok potevo linkare un file, lo so

    codice:
    #include <stdio.h>
    #include <malloc.h>
    #include <math.h>
    
    int laplace(int, int **);
    int Sarrus(int **, int);
    
    
    void main()
    	{
    	int size=0; // dimensione matrice di ingresso
    	int **ma;  // matrice di ingresso
    	int i, j;
    
    	// chiedo la matrice
    	printf("Digita la dimensione della matrice:\n");
    	scanf("%d", &size);
    	// controllo il valore
    	if (size<=0) return; 
    
    		// alloco la memoria della matrice
    		ma = (int **)malloc(size*sizeof(int));
    
    	// chiedo i valori della matrice di ingresso
    	printf("Digita gli elementi della matrice, riga per riga:\n");
    
    	for (i=0; i<size; i++)
    		{
    		*(ma+i) = (int *)malloc(size*sizeof(int));
    		for (j=0; j<size; j++)
    			{
    			scanf("%d", &ma[i][j]);
    		}	
    	}
    
    	// stampo la matrice di ingresso
    	for (i=0; i<size; i++)
    		{
    		for (j=0; j<size; j++)
    		printf("%4d ", ma[i][j]);
    		printf("\n");
    	}
    
    		// a seconda della dimensione prevedo i casi limite con size =1,2,3 ed n
    		if (size==1) printf("Determinante: %d", ma[0][0]);
    		else if (size==2 || size==3) printf("Determinante: %d", Sarrus(ma, size));
    		else printf("Determinante: %d\n",laplace(size, ma));
    
    
    }
    // implementa lo sviluppo di laplace del determinante rispetto alla prima riga
    // dato che č indifferente quale riga/colonna prendere la funzione prende la prima riga,
    // che č pių comodo
    int laplace(int ord, int **v)//ord == dimensione di v
    	{
    			int i, j, z, k=0;
    			int det=0;
    			int **p; // dichiaro un puntatore ad un array bidimensionale
    
    			int dim_p;
    
    			// dimensione delle sottomatrici
    			dim_p = ord-1;
     
    
    	p = (int **)malloc(dim_p*sizeof(int)); // alloco la memoria 
    	for (i=0; i<dim_p; i++)
    	*(p+i) = (int *)malloc(dim_p*sizeof(int));
    
    
    
    for (z=0; z<=dim_p; z++)
    	{
    	/**********************/
    	//creo le sottomatrici
    	for (i=1; i<=dim_p; i++)
    	{
    		for (j=0; j<=dim_p; j++)
    		{
    		if (j==z) k=1;
    		else p[i-1][j-k] = v[i][j];
    		}
    	k=0;
    	}
    	/********************************/
    	
    	// richiamo ricorsivamente la funzione laplace() e per ultima Sarrus()
    	if (dim_p>3)
    		det+=(int)pow(-1, z+2)*v[0][z]*laplace(dim_p, p);
    	else det+=(int)pow(-1, z+2)*v[0][z]*Sarrus(p,3); 
    }
    	return det;
    }
    
    // Implementa la regola di Sarrus
    int Sarrus(int **s, int ter)
    	{
    	int diaForward=1, diaBack=1;
    	int det=0;	
    
    	for (int i=0; i<(ter==2 ? 1 : ter); i++){
    		for (int j=0; j<ter; j++)
    			{
    			printf("%d %d\n", j, j+i<ter ? j+i : j+i-ter);
    			diaBack *= s[j][j+i<ter ? j+i : j+i-ter];
    			diaForward *= s[j][ter-j-1-i>=0 ? ter-j-1-i : 2*ter-j-i-1];
    		}
    		det+=diaBack-diaForward;
    		diaForward = diaBack = 1;
    }
    return det;
    }

    P.S.:
    Ovvio che probabilmente non funzionerā perché avrō beccato una matrice ***tarda che č un caso particolare e non m'ha fatto rilevare gli errori.
    dA .. foto di viaggio
    L'esperienza č il tipo di insegnante pių difficile.
    Prima ti fa l'esame, e poi ti spiega la lezione.

  8. #8
    effettivamente il codice funziona ma ho difficolta nel capirlo potresti mandarmi dei commenti soprattutto nella parte dove n>=3
    ti ringrazio

  9. #9
    Meno male che funziona

    Beh per n==1, se non erro il determinante coincide con l'unico elemento della matrice (non ho controllato perō).
    codice:
    if (size==1) printf("Determinante: %d", ma[0][0]);
    mentre per 2<=n<=3 parte la funzione Sarrus (dall'omonimo Matematico)
    e implementa nel caso di n=2 la differenza dei prodotti tra gli elementi delle 2 diagonali Aij = {a11, a12, a21, a22}
    quindi det = (a11*a22)-(a12*a21).
    codice:
    for (int i=0; i<(ter==2 ? 1 : ter); i++){
    //(ter==2 ? 1 : ter) controlla se la dimensione della matrice
    //č uguale a 2. In quel caso basta ciclare una sola volta 
    //(cioé non ciclare affatto)  
    		for (int j=0; j<ter; j++)
    			{
                             // questo printf me lo sono dimenticato, toglilo
    			//printf("%d %d\n", j, j+i<ter ? j+i : j+i-ter);
    			diaBack *= s[j][j+i<ter ? j+i : j+i-ter];
    			diaForward *= s[j][ter-j-1-i>=0 ? ter-j-1-i : 2*ter-j-i-1];
    		}
    		det+=diaBack-diaForward;
    		diaForward = diaBack = 1;
    }
    per n==3
    diaBack calcola la somma dei prodotti delle diagonali con la cima indietro (tipo backslash) mentre diaForward calcola la somma dei prodotti delle diagonali in avanti (tipo forwardslash).
    la differenza di diaBack e diaForward da il determinante per matrici 3x3

    n>3

    In questo caso si utilizza il metodo di laplace. Do per scontato che tu lo sappia (metto un link sotto cmq).


    la funzione prende 2 parametri, ord č la dimensione della matrice v, e v č la matrice che passiamo a laplace(). Siccome il metodo di laplace prevede di escludere dalla matrice originale una riga (la prima nel nostro caso) la funzione costruisce ogni volta una sotto matrice di un ordine inferiore rispetto alla precedente, fino ad arrivare a una matrice 3x3. Quindi avendo una matrice 4x4 la funzione esclude la prima riga e costruisce 4 sotto matrici una per ogni elemento della prima riga. Le sotomatrici sono costruite escludendo la colonna a cui appartiene l'elemento della prima riga (dal link si capisce meglio: Link - determinante) Quindi si va a calcolare il determinante delle sottomatrici se queste hanno dimensione 3, mentre si ripete il procedimento precedente se hanno dimensione maggiore di 3. Una volta arrivati a dimensione 3 Sarrus() calcola il determinante per ogni sottomatrice e lo restituisce a laplace (metodo ricorsivo). il determinante viene moltiplicato con il valore dell'elemento che appartiene alla prima riga (quella esclusa) e ogni prodotto viene sommato. La somma da il determinante della matrice.


    quindi il primo ciclo (quello con "z") scandisce le colonne da escludere mentre gli altri 2 cicli nidificati (con "i" e "j") leggono la matrice passata alla funzione e prendono i valori da immettere nella nuova sottomatrice z-esima

    codice:
    int laplace(int ord, int **v)//ord == dimensione di v
    	{
    			int i, j, z, k=0;
    			int det=0;
    			int **p; // dichiaro un puntatore ad un array bidimensionale
    
    			int dim_p;
    
    			// dimensione delle sottomatrici
    			dim_p = ord-1;
     
    
    	p = (int **)malloc(dim_p*sizeof(int)); // alloco la memoria 
    	for (i=0; i<dim_p; i++)
    	*(p+i) = (int *)malloc(dim_p*sizeof(int));
    
    
    
    for (z=0; z<=dim_p; z++)
    	{
    	/**********************/
    	//creo le sottomatrici
    	for (i=1; i<=dim_p; i++)
    	{
    		for (j=0; j<=dim_p; j++)
    		{
    		if (j==z) k=1;
    		else p[i-1][j-k] = v[i][j];
    		}
    	k=0;
    	}
    	/********************************/
    	
    	// richiamo ricorsivamente la funzione laplace() e per ultima Sarrus()
    	if (dim_p>3)
    		det+=(int)pow(-1, z+2)*v[0][z]*laplace(dim_p, p);
    	else det+=(int)pow(-1, z+2)*v[0][z]*Sarrus(p,3); 
    }
    	return det;
    }
    Dimmi se c'č altro che non ti č chiaro, il che puō essere dato che non mi sono spiegato proprio bene
    dA .. foto di viaggio
    L'esperienza č il tipo di insegnante pių difficile.
    Prima ti fa l'esame, e poi ti spiega la lezione.

  10. #10
    qualcuno e' in grado di fare la conversione di questo programma in c++(sono alle prime armi nella programmazione)

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.