public List <double> GetEigenvalues(Matrix A, QRDecomposition.QRAlgorithm method) { var eigenvalues = new List <double>(); int iter = 0; while (A.Row != 1) { iter++; for (int i = A.Row - 1; i > 0; i--) { if (Math.Abs(A.Elem[i][i - 1]) < 1e-6) { eigenvalues.Add(A.Elem[i][i]); A.ExcludeRowColumn(i); i = A.Row; } } if (A.Row == 1) { break; } double shift = WilcoxonShift(A); Shift(A, -shift); QRDecomposition QR = new QRDecomposition(A, method); A = QR.R * QR.Q; Shift(A, shift); } Console.WriteLine("Iter = " + iter.ToString() + "\n"); eigenvalues.Add(A.Elem[0][0]); eigenvalues.Sort(); eigenvalues.Reverse(); return(eigenvalues); }
public double CondSquareMatrix() { if (Row != Column) { throw new Exception("Row != Column"); } var QRSolver = new QRDecomposition(Transpose(), QRDecomposition.QRAlgorithm.Householder); int numberThreads = Environment.ProcessorCount; var semaphores = new bool[numberThreads]; var normaRowA = new double[numberThreads]; var normaRowA1 = new double[numberThreads]; var StartSolver = new ThreadSolver(number => { var A1 = new Vector(Row); double S1, S2; int begin = Column / numberThreads * number; int end = begin + Column / numberThreads; if (number + 1 == numberThreads) { end += Column % numberThreads; } for (int i = begin; i < end; i++) { A1.Elem[i] = 1.0; A1 = QRSolver.StartSolver(A1); S1 = 0; S2 = 0; for (int j = 0; j < Row; j++) { S1 += Math.Abs(Elem[i][j]); S2 += Math.Abs(A1.Elem[j]); A1.Elem[j] = 0; } normaRowA[number] = normaRowA[number] < S1 ? S1 : normaRowA[number]; normaRowA1[number] = normaRowA1[number] < S2 ? S2 : normaRowA1[number]; } semaphores[number] = true; }); for (int I = 0; I < numberThreads - 1; I++) { int number = numberThreads - I - 1; ThreadPool.QueueUserWorkItem(par => StartSolver(number)); } StartSolver(0); while (Array.IndexOf <bool>(semaphores, false) != -1) { } for (int i = 1; i < numberThreads; i++) { normaRowA[0] = normaRowA[0] < normaRowA[i] ? normaRowA[i] : normaRowA[0]; normaRowA1[0] = normaRowA1[0] < normaRowA1[i] ? normaRowA1[i] : normaRowA1[0]; } return(normaRowA[0] * normaRowA1[0]); }