Дана квадратная матрица размерности n*n вычислить ее определитель - C#

Узнай цену своей работы

Формулировка задачи:

Дана квадратная матрица размерности n*n вычислить ее определитель. Нужна помощь в написании кода, за ранее спасибо

Решение задачи: «Дана квадратная матрица размерности n*n вычислить ее определитель»

textual
Листинг программы
using System;
using System.Linq;
using System.Text;
 
namespace ConsoleApplication 
{
    class Program
    {
        public class Matrix
        {
            public float[,] matrix = null;
 
            public int CountColumn { get; private set; }
            public int CountRow { get; private set; }
 
            public Matrix(int x = 1, int y = 1)
            {
                matrix = new float[x, y];
 
                CountColumn = y;
                CountRow = x;
            }
 
            public float this[int x, int y]
            {
                get { return matrix[x, y]; }
                set { matrix[x, y] = value; }
            }
 
 
            public float[] GetRow(int row)
            {
                if (row >= CountRow) throw new IndexOutOfRangeException("Индекс строки не принадлежит массиву.");
                float[] ret = new float[CountColumn];
                for (int i = 0; i < CountColumn; i++)
                    ret[i] = matrix[row, i];
 
                return ret;
            }
 
            public void SetRow(float[] values, int row)
            {
                if (row >= CountRow) throw new IndexOutOfRangeException("Индекс строки не принадлежит массиву.");
                for (int i = 0; i < (CountColumn > values.Length ? values.Length : CountColumn); i++)
                    matrix[row, i] = values[i];
            }
 
            public float Determinant()
            {
                if (CountColumn != CountRow) throw new ArgumentException("Вычисление определителя возможно только для квадратных матриц.");
                Matrix _matrix = new Matrix(CountRow, CountColumn);
                _matrix.matrix = (float[,])this.matrix.Clone();
 
                float det = 1;
                int order = CountRow;
 
                for (int i = 0; i < order - 1; i++)
                {
                    float[] masterRow = _matrix.GetRow(i);
                    det *= masterRow[i];
                    if (det == 0) return 0;
                    for (int t = i + 1; t < order; t++)
                    {
                        float[] slaveRow = _matrix.GetRow(t);
                        float[] tmp = MulArrayConst(masterRow, slaveRow[i] / masterRow[i]);
                        float[] source = _matrix.GetRow(t);
                        _matrix.SetRow(SubArray(source, tmp), t);
                    }
                }
                det *= _matrix[order - 1, order - 1];
                return det;
            }
 
            public override string ToString()
            {
                StringBuilder ret = new StringBuilder();
                if (matrix == null) return ret.ToString();
 
                for (int i = 0; i < CountRow; i++)
                {
                    for (int t = 0; t < CountColumn; t++)
                    {
                        ret.Append(matrix[i, t]);
                        ret.Append("\t");
                    }
                    ret.Append("\n");
                }
                return ret.ToString();
            }
 
            float[] SubArray(float[] A, float[] B)
            {
                float[] ret = (float[])A.Clone();
                for (int i = 0; i < (A.Length > B.Length ? A.Length : B.Length); i++)
                    ret[i] -= B[i];
                return ret;
            }
 
            float[] MulArrayConst(float[] array, float number)
            {
                float[] ret = (float[])array.Clone();
                for (int i = 0; i < ret.Length; i++)
                    ret[i] *= number;
                return ret;
            }
 
            void generator(int x, int y, int startGen)
            {
                matrix = new float[x, y];
                Random rnd = new Random(startGen);
 
                for (int i = 0; i < x * y; i++)
                {
                    int X = i / y;
                    int Y = i - y * X;
                    matrix[X, Y] = rnd.Next(-10, 10);
                }
            }
        }
 
        static void Main()
        {
            Matrix m1 = new Matrix(3, 3);
            Console.WriteLine(m1.Determinant());
        }
    }
}

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

8   голосов , оценка 4.125 из 5
Похожие ответы