예제 #1
0
파일: KramerMethod.cs 프로젝트: mulykr/Lab3
        public double[] NonParallelSolve(double[,] matrix, double[] koeficients)
        {
            Stopwatch sw = new Stopwatch();

            sw.Start();
            System.Console.WriteLine("Solving by Kramer (Non-Parallel) is started!");
            System.Console.WriteLine("Proccessing...");

            int size = matrix.GetLength(0);

            double[] results = new double[size];
            D = Determinant.Calculate(matrix);
            double[] d = new double[matrix.GetLength(0)];
            double[,] tempMatrix;
            for (int i = 0; i < matrix.GetLength(0); i++)
            {
                tempMatrix = new double[size, size];
                for (int j = 0; j < size; j++)
                {
                    for (int k = 0; k < size; k++)
                    {
                        if (k == i)
                        {
                            tempMatrix[j, k] = koeficients[j];
                            continue;
                        }
                        tempMatrix[j, k] = matrix[j, k];
                    }
                }

                d[i] = Determinant.Calculate(tempMatrix);
                //System.Console.WriteLine($"d[{i + 1}] = {d[i]}");
            }

            for (int i = 0; i < size; i++)
            {
                results[i] = d[i] / D;
            }

            sw.Stop();
            System.Console.WriteLine($"Finished. Time elapsed: {sw.ElapsedMilliseconds}");
            return(results);
        }
예제 #2
0
파일: KramerMethod.cs 프로젝트: mulykr/Lab3
 private void GetPartialDeterminants(int start, int finish, int size, ref double[,] matrix, ref double[] koeficients, ref double[] d)
 {
     lock (obj)
     {
         double[,] tempMatrix = new double[size, size];
         for (int i = start; i < finish; i++)
         {
             for (int j = 0; j < size; j++)
             {
                 for (int k = 0; k < size; k++)
                 {
                     if (k == i)
                     {
                         tempMatrix[j, k] = koeficients[j];
                         continue;
                     }
                     tempMatrix[j, k] = matrix[j, k];
                 }
             }
             d[i] = Determinant.Calculate(tempMatrix);
             System.Console.WriteLine($"d[{i + 1}] = {d[i]}");
         }
     }
 }
예제 #3
0
파일: KramerMethod.cs 프로젝트: mulykr/Lab3
        public double[] Solve(double[,] matrix, double[] koeficients)
        {
            System.Console.WriteLine("Solving by Kramer (Parallel) is started!");
            System.Console.WriteLine("Proccessing...");
            Stopwatch sw = new Stopwatch();

            D = Determinant.Calculate(matrix);
            int size = matrix.GetLength(0);

            double[] results = new double[size];
            sw.Start();
            double[] d    = new double[size];
            Thread[] list = new Thread[THREADS_COUNT];
            for (int i = 0; i < THREADS_COUNT; ++i)
            {
                double diapazone = size / THREADS_COUNT;
                int    begin     = (int)(i * diapazone);
                int    end       = i == THREADS_COUNT - 1 ? size : (int)((i + 1) * diapazone);

                list[i] = new Thread(() => GetPartialDeterminants(begin, end, size, ref matrix, ref koeficients, ref d));
                list[i].Start();
            }

            for (int i = 0; i < THREADS_COUNT; i++)
            {
                list[i].Join();
            }

            for (int i = 0; i < size; i++)
            {
                results[i] = d[i] / D;
            }
            sw.Stop();
            System.Console.WriteLine($"Finished. Time elapsed: {sw.ElapsedMilliseconds}");
            return(results);
        }