/// <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
}// 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()