Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.51/75: Рейтинг темы: голосов - 75, средняя оценка - 4.51
16 / 16 / 0
Регистрация: 28.08.2012
Сообщений: 25

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

30.06.2013, 13:50. Показов 15291. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет!Я искал способ написания кода для нахождения определителя квадратной матрицы. На форуме выкладывалась библиотека, в которой использовался метод Гаусса(приведение матрицы к треугольному виду и нахождение определителя как произведения элементов главной диагонали), но в том коде не все было учтено, в частности детерминант рассчитывался неверно если в процессе преобразований возникала ситуация с делением на 0.
Мне наконец таки удалось написать код, который работает по принципу уменьшения порядка определителя путем разложения его по первой строке. Главные преимущества - это относительная простота кода и отсутствие операции деления вовсе. Возможно окажется полезным таким же новичкам, как и я.
Первый метод возвращает минор матрицы(matrix) путем вычеркивания строки с номером row и колонки с номером column(исходная матрица не меняется).
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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;
        }
И наконец второй метод рассчитывает определитель матрицы размерностью NxN:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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;
        }
Позже допишу еще методы для работы с матрицами(транспонирование, обращение, прочее).
13
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
30.06.2013, 13:50
Ответы с готовыми решениями:

Нахождение определителя квадратной матрицы второго порядка
Составить программу по нахождению определителя квадратной матрицы второго порядку.

Перемножение двух матриц и нахождение определителя квадратной матрицы
Разработать программу, выполняющую перемножение двух матриц и нахождение определителя квадратной матрицы

Составить программу по нахождению определителя квадратной матрицы 2 и 3 порядка
Составить программу по нахождению определителя квадратной матрицы 2 и 3 порядка

6
Неадекват
 Аватар для freeba
1501 / 1237 / 248
Регистрация: 02.04.2010
Сообщений: 2,807
30.06.2013, 20:37
Вот хороший человек. Допилил, то, на что рук не хватало. Держи плюс.
0
3 / 3 / 0
Регистрация: 26.02.2014
Сообщений: 27
21.10.2014, 17:05
Я вот недавно тоже делал, но на паскале. У тебя несколько раз идет обращение к длине массива - это не очень хорошо.
Посмотри, что я сделал:
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
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.
0
871 / 721 / 304
Регистрация: 15.04.2013
Сообщений: 2,047
Записей в блоге: 5
21.10.2014, 17:18
groser,

Не по теме:

У вас сообщение Exception сделано что бы заранее никто не узнал что там написано?

0
3 / 3 / 0
Регистрация: 26.02.2014
Сообщений: 27
21.10.2014, 17:22
Да так.. Я вообще написал это другу. Над ним прикалывает. Да еще там маты, а это, вроде, культурный форум)
(Не по теме) как сделать такое "не по теме"?
1
0 / 0 / 0
Регистрация: 12.11.2014
Сообщений: 2
12.11.2014, 21:47
А можно ли с помощью этих методов найти алгебраическое дополнение?
если можно, прошу дописать код)
0
0 / 0 / 1
Регистрация: 10.07.2016
Сообщений: 27
23.01.2017, 22:13
Попытался применить этот код для матрицы 20x20. Программа виснет.
Вопрос: Как оптимизировать функции, приведенные в первом посте, дабы увеличить скорость выполнения расчетов?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
23.01.2017, 22:13
Помогаю со студенческими работами здесь

Составить программу по нахождению определителя квадратной матрицы 2 и 3 порядка
Составить программу по нахождению определителя квадратной матрицы 2 и 3 порядка

Немного доработать метод по нахождению определителя квадратной матрицы
Добрый день, есть класс, помогите пожалуйста дописать метод по нахождению определителя квадратной матрицы н-ого порядка class...

Составить программу по нахождению определителя квадратной матрицы 2 и 3 порядка
Составить программу по нахождению определителя квадратной матрицы 2 и 3 порядка

Составить программу по нахождению определителя квадратной матрицы второго и третьего порядка по выбору
Составить программу по нахождению определителя квадратной матрицы второго и третьего порядка по выбору. Добавлено через 7 минут Пока...

Составить программу по нахождению определителя квадратной матрицы второго и третьего порядка по выбору
Составить программу по нахождению определителя квадратной матрицы второго и третьего порядка по выбору. В программе, кроме решения...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru