Нахождение определителя квадратной матрицы (готовое решение) - C#

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

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

Всем привет!Я искал способ написания кода для нахождения определителя квадратной матрицы. На форуме выкладывалась библиотека, в которой использовался метод Гаусса(приведение матрицы к треугольному виду и нахождение определителя как произведения элементов главной диагонали), но в том коде не все было учтено, в частности детерминант рассчитывался неверно если в процессе преобразований возникала ситуация с делением на 0. Мне наконец таки удалось написать код, который работает по принципу уменьшения порядка определителя путем разложения его по первой строке. Главные преимущества - это относительная простота кода и отсутствие операции деления вовсе. Возможно окажется полезным таким же новичкам, как и я. Первый метод возвращает минор матрицы(matrix) путем вычеркивания строки с номером row и колонки с номером column(исходная матрица не меняется).
Листинг программы
  1. public static double[,] GetMinor(double[,] matrix, int row, int column)
  2. {
  3. if (matrix.GetLength(0) != matrix.GetLength(1)) throw new Exception(" Число строк в матрице не совпадает с числом столбцов");
  4. double[,] buf = new double[matrix.GetLength(0)-1,matrix.GetLength(0)-1];
  5. for (int i=0;i<matrix.GetLength(0);i++)
  6. for (int j=0;j<matrix.GetLength(1);j++)
  7. {
  8. if ((i!=row) || (j!=column))
  9. {
  10. if (i > row && j < column) buf[i - 1, j] = matrix[i, j];
  11. if (i < row && j > column) buf[i, j - 1] = matrix[i, j];
  12. if (i > row && j > column) buf[i - 1, j - 1] = matrix[i,j];
  13. if (i < row && j < column) buf[i, j] = matrix[i, j];
  14. }
  15. }
  16. return buf;
  17. }
И наконец второй метод рассчитывает определитель матрицы размерностью NxN:
Листинг программы
  1. public static double Determ(double[,] matrix)
  2. {
  3. if (matrix.GetLength(0) != matrix.GetLength(1)) throw new Exception(" Число строк в матрице не совпадает с числом столбцов");
  4. double det = 0;
  5. int Rank = matrix.GetLength(0);
  6. if (Rank == 1) det = matrix[0, 0];
  7. if (Rank == 2) det = matrix[0, 0] * matrix[1, 1] - matrix[0, 1] * matrix[1, 0];
  8. if (Rank > 2)
  9. {
  10. for (int j = 0; j < matrix.GetLength(1); j++)
  11. {
  12. det += Math.Pow(-1,0+j)*matrix[0, j] * Determ(GetMinor(matrix, 0, j));
  13. }
  14. }
  15. return det;
  16. }
Позже допишу еще методы для работы с матрицами(транспонирование, обращение, прочее).

Решение задачи: «Нахождение определителя квадратной матрицы (готовое решение)»

textual
Листинг программы
  1. var a:array[,] of real;
  2. b:byte;
  3. function del(a:array[,] of real;x,y:integer):array[,] of real;
  4. var xxx,yyy,b:integer;
  5. begin
  6.  b:=a.GetLength(0);
  7.  Result:=new real[b-1,b-1];
  8.  for var xx:=0 to b-1 do
  9.  for var yy:=0 to b-1 do
  10.  begin
  11.  if(x=xx)or(yy=y)then continue;
  12.  xxx:=xx;
  13.  yyy:=yy;
  14.  if xx>=x then Dec(xxx);
  15.  if y<=yy then Dec(yyy);
  16.  Result[xxx,yyy]:=a[xx,yy];
  17.  end;
  18. end;
  19. function det(a:array[,] of real):real;
  20. var b,y:integer;
  21. begin
  22.  b:=a.GetLength(0);
  23.  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','ц','к','р','.','ы','В','а','е','б','Н','н','о','?','л','с',','));
  24.  if b=2 then
  25.  begin
  26.  Result:=a[0,0]*a[1,1]-a[0,1]*a[1,0];
  27.  exit;
  28.  end;
  29.  for var xx:=0 to b-1 do
  30.  for var yy:=0 to b-1 do
  31.  if a[xx,yy]=0 then
  32.  begin
  33.  y:=yy;
  34.  break;
  35.  end;
  36.  for var i:=0 to b-1 do
  37.  if Odd(i+y) then
  38.  Result-=det(del(a,i,y))*a[i,y] else
  39.  Result+=det(del(a,i,y))*a[i,y];
  40. end;
  41. begin
  42.  writeln('Мерность:');
  43.  readln(b);
  44.  a:=new real[b,b];
  45.  for var xx:=0 to b-1 do
  46.  for var yy:=0 to b-1 do
  47.  begin
  48.  write('(',xx+1,',',yy+1,')=');
  49.  readln(a[xx,yy]);
  50.  end;
  51.  for var xx:=0 to b-1 do
  52.  for var yy:=0 to b-1 do
  53.  if yy=b-1 then writeln(a[xx,yy]:3) else
  54.  write(a[xx,yy]:3,' ');
  55.  var d:=det(a);
  56.  writeln('det=',d);
  57.  readln();
  58. end.

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


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

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

8   голосов , оценка 4.25 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы