예제 #1
0
 /// <summary>
 /// Ctor
 /// </summary>
 /// <param name="columnCardinality">matrix size</param>
 /// <param name="SubMatrix">the SubMatrix</param>
 /// <param name="Det">determinant</param>
 public SmallerDet(int columnCardinality, LinearAlgebra.RealMatrix SubMatrix, double Det)
 {
     this.SubMatrixSize = columnCardinality;// it's a square subMat.
     this.SubMatrix     = SubMatrix;
     this.Det           = Det;
 } // end Ctor
예제 #2
0
        }// end gestioneQuadrata

        /// <summary>
        /// metodo ricorsivo che, partendo da una nxn, trova tutte le sottomatrici kxk, con k in [1, n-1].
        /// </summary>
        /// <param name="quadrataAnalizzanda"></param>
        /// <returns></returns>
        private int sottomatriciTelescopiche(LinearAlgebra.RealMatrix quadrataAnalizzanda)
        {
            //
            int Rank = 0;// init

#if debug
            rangoQuadrata_recursion_ordinal++;                                                                  //----dbg----
            System.Console.WriteLine(" rangoQuadrata_recursion_ordinal= {0}", rangoQuadrata_recursion_ordinal); //----dbg----
#endif
            //
            for (int curRow = 0; curRow < quadrataAnalizzanda.Get_rows; curRow++)
            {
                for (int curCol = 0; curCol < quadrataAnalizzanda.Get_cols; curCol++)
                {
                    LinearAlgebra.RealMatrix subMatrix = quadrataAnalizzanda.reductor(curRow, curCol);  // current SubMatrix
#if debug
                    System.Console.WriteLine(" dimensione sottomatrice= {0}", subMatrix.Get_rows);
                    System.Console.WriteLine(" linee eliminate row, col = {0},{1}", curRow, curCol);
                    subMatrix.show();
#endif
                    //
                    if (0 == subMatrix.Get_rows) // size one matrix is a scalar;
                    {                            // zero size matrix is no-number.
                        return(-1);              //-1 means 0x0 matrix dimension reached.
                    }// avoid an exception, due to zero-sized matrix.
                    //
                    //---------##########################################
                    double subMatrix_det = subMatrix.det();//############
                    //---------##########################################
                    //
                    //-----scrivere estrattore di linee coinvolte nella firma
                    //
                    // codifica:
                    // -2 means by now determinant is null.
                    // -1 means 0x0 matrix dimension reached.
                    // 0 means null scalar submatrix reached.
                    // n_in_N means a positive Rank was found.
                    //
                    if (System.Math.Abs(subMatrix_det) < +1.0E-12)                                 //-------- by now(i.e. in this dimension) determinant is null.--------------
                    {                                                                              // don't log anything, since determinant is null.
                        Rank = -2;                                                                 // -2 means by now determinant is null.
                    }
                    else if (System.Math.Abs(subMatrix_det) < +1.0E-12 && subMatrix.Get_rows == 1) // 0 means null scalar submatrix reached.
                    {                                                                              // don't log anything, since determinant is null.
                        Rank = 0;                                                                  // 0 means null scalar submatrix reached.
                    }
                    else if (System.Math.Abs(subMatrix_det) >= +1.0E-12)                           //-------#########----positive Rank found---#############--------------
                    {                                                                              //----- log dimension and signature----------###########################-----------------------------------------
                        Rank = subMatrix.Get_rows;                                                 // Rank = subMatrix.Get_rows==n_in_N means a positive Rank was found.
#if debug
                        System.Console.WriteLine(" first stop at Rank={0}", Rank);
#endif
                        //---#########################################################------data structure insertion here !-at position[dimension]----##################
                        ((System.Collections.ArrayList)(involvedDimensions[subMatrix.Get_rows])).Add(new SmallerDet(
                                                                                                         subMatrix.Get_rows,
                                                                                                         subMatrix,
                                                                                                         subMatrix_det)
                                                                                                     );
#if LogSinkFs
                        LogSinkFs.Wrappers.LogWrappers.SectionContent("size = " + subMatrix.Get_rows, 0);
                        subMatrix.show_LogSinkFs();
                        LogSinkFs.Wrappers.LogWrappers.SectionContent("det = " + subMatrix_det, 0);
#endif
                    }
                    else
                    {
                        throw new System.Exception("exception in Rank if_instructions found");
                    }
                    //
#if debug
                    System.Console.WriteLine(" Rank= {0}", Rank);
                    System.Console.WriteLine(" det sottomatrice= {0}", subMatrix_det);
#endif
                    //
                    //---------------------------#########################___start recursion__#########################-------------------
                    Rank = sottomatriciTelescopiche(subMatrix);  //-----#########################___start recursion__################-----
                    //
                }// end for Get_cols
            }// end for Get_rows
            // ready
            return(Rank);
        }// end sottomatriciTelescopiche()