Visualizzazione dei risultati da 1 a 4 su 4

Discussione: [C#] determinante

  1. #1

    [C#] determinante

    sto scrivendo un metodo per calcolare il determinante di una matrice visto che con monodevelop sto avendo problemi ad usare matrix.Determinant...
    mi sta facendo davvero impazzire, vi copio il codice:
    codice:
    using System;
    
    namespace Matrix
    {
        class MatrixUtilities
        {
            public static void Main(string[] args)
            {
                double[,] matrix =  {   {2,4,6,8},
                                                {1,3,5,7},
                                                {4,6,8,10},
                                                {3,5,7,9} };
                // numero di righe e di colonne                                
                int[] nRC = {4,4};
                
    
                double det = Determinant(matrix, nRC[0], nRC[1], 0);
                Console.Write("Determinante: " + det);
    
                Console.ReadLine();
            }
    
            // suppongo che la matrice sia quadrata
            // calcolo il determinante passando: matrice, numero di righe, numero di colonne, la colonna della sottomatrice da escludere
            public static double Determinant(double[,] matrix, int nR, int nC, int colonnaEsclusa)
            {
                double det = 0;
    
                if (nR == 1) // caso matrice 1x1
                    det = matrix[0,0];
    
                if (nR == 2) // caso matrice 2x2
                    det = (matrix[0,0] * matrix[1,1]) - (matrix[0,1] * matrix[1,0]);
    
                else // casi matrice 3x3 e maggiori
                {
                    // dichiaro la sottomatrice con una riga e una colonna in meno
                    double[,] tempMatrix = new double[nR - 1, nC - 1];
    
                    // assegno i valori alla sottomatrice escludendo sempre la prima riga e una colonna
                    for(int r = 1; r < nR; r++)
                    {
                        for(int c = 0; c < nC; c++)
                        {
                            if(c == colonnaEsclusa)
                                c++;
                            tempMatrix[r,c] = matrix[r,c];
                        }
                    }
    
                    // moltiplico gli elementi della prima riga per i determinanti delle loro sottomatrici 
                    for(int c = 0; c < nC; c++) // scorro tutta la prima riga
                        det = det + Math.Pow(-1, c) * matrix[0,c] * Determinant(tempMatrix, nR - 1, nC - 1, colonnaEsclusa + 1);
                        
                }
    
                return det;
    
            }
        }
    }
    questo codice genera l'errore:
    " Unhandled Exception:
    System.IndexOutOfRangeException: Array index is out of range.
    at Matrix.MatrixUtilities.Determinant (System.Double[,] matrix, Int32 nR, Int32 nC, Int32 colonnaEsclusa) [0x00000] in <filename unknown>:0
    at Matrix.MatrixUtilities.Main (System.String[] args) [0x00000] in <filename unknown>:0
    [ERROR] FATAL UNHANDLED EXCEPTION: System.IndexOutOfRangeException: Array index is out of range.
    at Matrix.MatrixUtilities.Determinant (System.Double[,] matrix, Int32 nR, Int32 nC, Int32 colonnaEsclusa) [0x00000] in <filename unknown>:0
    at Matrix.MatrixUtilities.Main (System.String[] args) [0x00000] in <filename unknown>:0 "

    se ho capito bene è l'indice che fuoriesce dalla matrice, ma non riesco a capire dove e perchè.
    qualcuno sa come correggere questo errore?

  2. #2
    Utente di HTML.it
    Registrato dal
    Jan 2011
    Messaggi
    237
    Prova a fare il debug del codice un'istruzione alla volta:
    Imposta un breakpoint all'inizio della Main e poi prosegui con F8...
    Certo che questi sono errori proprio banali... Dovresti considerare l'idea di studiare un pochino o leggerti delle guide, perché altrimenti rischi di perdere le ore per risolvere problemi che non sono di programmazione quando di "disattenzione"...

  3. #3
    Utente di HTML.it
    Registrato dal
    Jul 2004
    Messaggi
    99
    Ciao,


    bada bene che non è la soluzione. IMHO ci sono diversi punti da aggiustare specie l'algoritmo di calcolo sottomatrice che cmq va messo in un metodo esterno e meglio se con Generics Keywords.

    Spero ti possa aiutare, sempre se ho capito bene il tutto...sono un asino in matematica!:

    codice:
    namespace ConsoleApplicationDeterminanteMatrix{
        class Program
        {
            private static void printMyArray<T>( T[,] arr) {
                int rowLength = arr.GetLength(0);
                int colLength = arr.GetLength(1);
    
    
                for (int i = 0; i < rowLength; i++)
                {
                    for (int j = 0; j < colLength; j++)
                    {
                        Console.Write(string.Format("{0} ", arr[i, j]));
                    }
                    Console.Write(Environment.NewLine + Environment.NewLine);
                }
            }
             public static void Main(string[] args)
            {
                double[,] matrix =  {   {2,4,6,8},
                                        {1,3,5,7},
                                        {4,6,8,10},
                                        {3,5,7,9} };
    
    
    
    
                Console.WriteLine("Matrice di partenza matrix: ");
                printMyArray(matrix);
                Console.WriteLine("===========================================");
                // numero di righe e di colonne                                
                int[] nRC = {4,4};
                
    
    
                double det = Determinant(matrix, nRC[0], nRC[1], 0);
                Console.Write("Determinante: " + det); 
                Console.ReadLine(); 
            }
    
    
            // suppongo che la matrice sia quadrata
            // calcolo il determinante passando: matrice, numero di righe, numero di colonne, la colonna della sottomatrice da escludere
            public static double Determinant(double[,] matrix, int nR, int nC, int colonnaEsclusa)
            {
                double det = 0;
    
    
                if (nR == 1) // caso matrice 1x1
                    det = matrix[0,0];
    
    
                if (nR == 2) // caso matrice 2x2
                    det = (matrix[0,0] * matrix[1,1]) - (matrix[0,1] * matrix[1,0]);
    
    
                else // casi matrice 3x3 e maggiori
                {
                    // dichiaro la sottomatrice con una riga e una colonna in meno
                   double[,] tempMatrix = new double[nR - 1, nC - 1];
    
    
                    // assegno i valori alla sottomatrice escludendo sempre la prima riga e una colonna
                  
                    for(int r = 1; r < nR; r++)
                    {
                        int deltaColumn = 0 ;
                        for (int c = 0; c < matrix.GetUpperBound(1); c++)
                        {
                            if(c == colonnaEsclusa)
                                deltaColumn++;
                            tempMatrix[r-1, c] = matrix[r, c + deltaColumn];
                        }
                    }
                   /*    */
                    Console.WriteLine("Matrice di ottenuta tempMatrix: ");
                    printMyArray(tempMatrix);
                    Console.WriteLine("===========================================");
                 
                    // moltiplico gli elementi della prima riga per i determinanti delle loro sottomatrici 
                    for(int c = 0; c < nC; c++) // scorro tutta la prima riga
                        det = det + Math.Pow(-1, c) * matrix[0,c] * Determinant(tempMatrix, nR - 1, nC - 1, colonnaEsclusa + 1);
                        
                }
    
    
                return det;
    
    
            }
             
        } 
    }
    se mi chiedeste chi è per me un vero amico vi risponderei che è una persona che io considero alla pari di me.

  4. #4
    usando
    matrix.GetLength(0);
    matrix.GetLength(1);
    posso evitare di usare l'array nRC in cui ho salvato il numero di righe e di colonne di matrix?

    con generic keywords intendi che devo far funzionare il programma per ogni possibile matrice?
    perchè in un altro file.cs tengo il programma completo che man mano integro con le parti funzionanti, così evito di incasinarlo con metodi che non funzionano (come questo lol).
    Ultima modifica di mastodilu; 26-02-2015 a 15:11

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.