Нахождение определителя квадратной матрицы (готовое решение) - C#
Формулировка задачи:
Всем привет!Я искал способ написания кода для нахождения определителя квадратной матрицы. На форуме выкладывалась библиотека, в которой использовался метод Гаусса(приведение матрицы к треугольному виду и нахождение определителя как произведения элементов главной диагонали), но в том коде не все было учтено, в частности детерминант рассчитывался неверно если в процессе преобразований возникала ситуация с делением на 0.
Мне наконец таки удалось написать код, который работает по принципу уменьшения порядка определителя путем разложения его по первой строке. Главные преимущества - это относительная простота кода и отсутствие операции деления вовсе. Возможно окажется полезным таким же новичкам, как и я.
Первый метод возвращает минор матрицы(matrix) путем вычеркивания строки с номером row и колонки с номером column(исходная матрица не меняется).
И наконец второй метод рассчитывает определитель матрицы размерностью NxN:
Позже допишу еще методы для работы с матрицами(транспонирование, обращение, прочее).
public static double[,] GetMinor(double[,] matrix, int row, int column) { if (matrix.GetLength(0) != matrix.GetLength(1)) throw new Exception(" Число строк в матрице не совпадает с числом столбцов"); double[,] buf = new double[matrix.GetLength(0)-1,matrix.GetLength(0)-1]; for (int i=0;i<matrix.GetLength(0);i++) for (int j=0;j<matrix.GetLength(1);j++) { if ((i!=row) || (j!=column)) { if (i > row && j < column) buf[i - 1, j] = matrix[i, j]; if (i < row && j > column) buf[i, j - 1] = matrix[i, j]; if (i > row && j > column) buf[i - 1, j - 1] = matrix[i,j]; if (i < row && j < column) buf[i, j] = matrix[i, j]; } } return buf; }
public static double Determ(double[,] matrix) { if (matrix.GetLength(0) != matrix.GetLength(1)) throw new Exception(" Число строк в матрице не совпадает с числом столбцов"); double det = 0; int Rank = matrix.GetLength(0); if (Rank == 1) det = matrix[0, 0]; if (Rank == 2) det = matrix[0, 0] * matrix[1, 1] - matrix[0, 1] * matrix[1, 0]; if (Rank > 2) { for (int j = 0; j < matrix.GetLength(1); j++) { det += Math.Pow(-1,0+j)*matrix[0, j] * Determ(GetMinor(matrix, 0, j)); } } return det; }
Решение задачи: «Нахождение определителя квадратной матрицы (готовое решение)»
textual
Листинг программы
var a:array[,] of real; b:byte; function del(a:array[,] of real;x,y:integer):array[,] of real; var xxx,yyy,b:integer; begin b:=a.GetLength(0); Result:=new real[b-1,b-1]; for var xx:=0 to b-1 do for var yy:=0 to b-1 do begin if(x=xx)or(yy=y)then continue; xxx:=xx; yyy:=yy; if xx>=x then Dec(xxx); if y<=yy then Dec(yyy); Result[xxx,yyy]:=a[xx,yy]; end; end; function det(a:array[,] of real):real; var b,y:integer; begin b:=a.GetLength(0); if b<2 then raise new Exception(string.Format('{17}{16}{1}{25}{0}{20}{23}{1}{20}{18}{25}{20}{19}{26}{27}{1}{25}{0}{20}{23}{1}{5}{5}{19}{25}{0}{1}{2}{18}{3}{14}{0}{12}{8}{1}{10}{4}{10}{1}{0}{25}{0}{1}{11}{4}{11}{15}{1}{21}{19}{1}{22}{18}{7}{23}{1}{3}{18}{13}{6}{1}{17}{16}{1}{9}{19}{1}{22}{19}{1}{20}{18}{25}{20}{19}{26}{27}{1}{5}{19}{14}{22}{23}{24}','и',' ','м','т','х','в','!','д','у','ж','0','1','ц','к','р','.','ы','В','а','е','б','Н','н','о','?','л','с',',')); if b=2 then begin Result:=a[0,0]*a[1,1]-a[0,1]*a[1,0]; exit; end; for var xx:=0 to b-1 do for var yy:=0 to b-1 do if a[xx,yy]=0 then begin y:=yy; break; end; for var i:=0 to b-1 do if Odd(i+y) then Result-=det(del(a,i,y))*a[i,y] else Result+=det(del(a,i,y))*a[i,y]; end; begin writeln('Мерность:'); readln(b); a:=new real[b,b]; for var xx:=0 to b-1 do for var yy:=0 to b-1 do begin write('(',xx+1,',',yy+1,')='); readln(a[xx,yy]); end; for var xx:=0 to b-1 do for var yy:=0 to b-1 do if yy=b-1 then writeln(a[xx,yy]:3) else write(a[xx,yy]:3,' '); var d:=det(a); writeln('det=',d); readln(); end.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д