Форум программистов, компьютерный форум, киберфорум
Наши страницы
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
 
Aen_Elle
0 / 0 / 0
Регистрация: 22.04.2017
Сообщений: 1
1

Поиск определителя через минор

22.04.2017, 15:46. Просмотров 134. Ответов 0

Доброго времени суток.

Необходимо найти определитель матрицы размерности NxN через миноры. Основная задумка - с помощью рекурсивной функции понижаем ранг матрицы вычеркивая рядок и столбец вплоть до матрицы 2х2. Затем возвращаться в обратном порядке, умножая минор на элемент и суммируя.
Код работает на PascalABC.NET, но при аналогичной функции в Delphi 7, для матрицы ранга 4 и выше, не пойму откуда появляются шестизначные числа, в результате определитель матрицы 4х4 превышает несколько миллионов.

Процесс записи значений из Edit в массив упускаю - там все работает.

Код на Pascal:

Кликните здесь для просмотра всего текста
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
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
Program recurse;
Uses crt;
Type matrix = array of array of Integer;
 
Function Determinant(mat:matrix) : Integer;
Var semat: matrix;
i, j, k, ia, ja: Byte;
rez, size: Integer;
 
Begin
 size:=Length(mat); 
 SetLength(semat, size-1);
  For i:=0 to size-2 do
   SetLength(semat[i], size-1);
 
 If size = 2 then
  begin
   Determinant:= mat[0,0] * mat[1,1] - mat[0,1] * mat[1,0];
  end 
 else if size > 2 then
  begin
   For k:=0 to size-1 do
    begin
     ia:=0;
     For i:=1 to size-1 do
      begin
       j:=0;
       ja:=0;
       While j < size do
        begin
         If ja = k then 
          begin
           j:=j+1;
            If j > size-1 then
             break;
          end;
         semat[ia,ja]:=mat[i,j];
         ja:=ja + 1;
         j:=j+1;
        end;
       ia:=ia+1;
       j:=0;
       ja:=0;
      end;
     
     If odd(k+1) then 
      Rez:=(Determinant(semat) * mat[0,k]) + rez
     else 
      Rez:=(Determinant(semat) * mat[0,k] * (-1)) + rez;
    end;
    Determinant:=rez;
    
    
  end;  
End;    
 
Var matr: matrix;
i, j: Byte;
 
Begin
 SetLength(matr, 6);
  For i:=0 to 5 do
   begin
    SetLength(matr[i], 6);
     For j:=0 to 5 do
      begin
       matr[i,j]:= random(6)+1;
       Write(matr[i,j],' ');
      end;
     Writeln;
   end;
Writeln(Determinant(matr));
 
End.


Код на Delphi 7:

Кликните здесь для просмотра всего текста
Delphi
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
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
unit Unit1;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;
 
type
matrix = array of array of Longint;
  TForm1 = class(TForm)
    Edit1: TEdit;
    Edit2: TEdit;
    . . . .
    Edit82: TEdit;  
    ComboBox1: TComboBox;
    Button1: TButton;
    procedure ComboBox1Change(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.dfm}
 
 
Function Determinant(mat:matrix): Longint ;
Var semat: matrix;
i, j, k, ia, ja: LongInt;
rez, size: Longint;
 
 
Begin
 size:=Length(mat); // определение размерности полученной матрицы
 SetLength(semat, size-1); // создание второго массива с меньшей размерностью
  For i:=0 to size-2 do
   SetLength(semat[i], size-1);
 
 If size = 2 then 
  begin
   Determinant:= mat[0,0] * mat[1,1] - mat[0,1] * mat[1,0];
  end
 else if size > 2 then
  begin
   For k:=0 to size-1 do // количество дочерних матриц созданных откидыванием 1го рядка и k-го столбца
    begin
     ia:=0;
     For i:=1 to size-1 do // Запись из матрицы большей размерности в меньшую
      begin
       j:=0;
       ja:=0;
       While j < size do
        begin
         If ja = k then 
          begin
           j:=j+1;
            If j > size-1 then
             break;
          end;
         semat[ia,ja]:=mat[i,j];
         ja:=ja + 1;
         j:=j+1;
        end;
       ia:=ia+1;
       j:=0;
       ja:=0;
      end;
 
     If odd(k+1) then // подсчет определителя, каждый второй элемент с отрицательным знаком 
     begin
      Rez:=(Determinant(semat) * mat[0,k]) + rez; // рекурсия
     end
     else
      Rez:=(Determinant(semat) * mat[0,k] * (-1) + rez);
     end;
    Determinant:= rez;
 
  end;
 
End;
 
 
 
 
procedure TForm1.Button1Click(Sender: TObject);
var i, j: Integer;
mat: matrix;
 
begin
 case ComboBox1.ItemIndex of
 
  0: // Для матрицы 2х2
   begin
    SetLength(mat, 2); // выделение памяти под динамический массив
     For i:=0 to 1 do
      SetLength(mat[i], 2);
   j:=0;
    For i:=0 to 1 do // запись значений из Edit-ов в массив
     begin
      mat[0,j]:=StrToInt(TEdit(Components[i]).Text);
      j:=j+1;
     end;
   j:=0;
    For i:=9 to 10 do
     begin
      mat[1,j]:=StrToInt(TEdit(Components[i]).Text);
      j:=j+1;
     end;
    Edit82.Text:=IntToStr(Determinant(mat)); // вызов функции
   end;
 
  1: // для матрицы 3х3
   begin
    SetLength(mat, 3); // выделение памяти под динамический массив
     For i:=0 to 2 do
      SetLength(mat[i], 3);
   j:=0;
    For i:=0 to 2 do // запись значений из Edit-ов в массив
     begin
      mat[0,j]:=StrToInt(TEdit(Components[i]).Text);
      j:=j+1;
     end;
   j:=0;
    For i:=9 to 11 do
     begin
      mat[1,j]:=StrToInt(TEdit(Components[i]).Text);
      j:=j+1;
     end;
   j:=0;
    For i:=18 to 20 do
     begin
      mat[2,j]:=StrToInt(TEdit(Components[i]).Text);
      j:=j+1;
     end;
    Edit82.Text:=IntToStr(Determinant(mat));  // вызов функции
   end;
 
   2: // Для матрицы 4х4
    begin
    SetLength(mat, 4); // выделение памяти под динамический массив
     For i:=0 to 3 do
      SetLength(mat[i], 4);
   j:=0;
    For i:=0 to 3 do // запись значений из Edit-ов в массив
     begin
      mat[0,j]:=StrToInt(TEdit(Components[i]).Text);
      j:=j+1;
     end;
   j:=0;
    For i:=9 to 12 do
     begin
      mat[1,j]:=StrToInt(TEdit(Components[i]).Text);
      j:=j+1;
     end;
   j:=0;
    For i:=18 to 21 do
     begin
      mat[2,j]:=StrToInt(TEdit(Components[i]).Text);
      j:=j+1;
     end;
   j:=0;
    For i:=27 to 30 do
     begin
      mat[3,j]:=StrToInt(TEdit(Components[i]).Text);
      j:=j+1;
     end;
    Edit82.Text:=IntToStr(Determinant(mat)); // вызов функции
   end;
end;
end;
 
end.


В первой программе использовал итерацию вместо рекурсии. Все также, код работал на Pascal'e; при этом возвращал несколько миллионов в Delphi 7.

В первую очередь интересует где ошибка в предоставленном коде, чем обусловлена адекватная работа программы лишь на Паскале; также буду благодарен за советы, касающиеся общей читабельности кода, оптимизации и пр.,
0
Вложения
Тип файла: rar Determinant.rar (164.0 Кб, 2 просмотров)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.04.2017, 15:46
Ответы с готовыми решениями:

Поиск через adoquery
Всем привет! Не могу разобраться с проблемой: with ADOQuery1 do begin Close; SQL.Clear;...

Поиск через FindDialog
Здравствуйте! У меня есть компонент Memo и Find в созданном главном меню. К сожалению, код, что...

Поиск через FindDialog
Нужно организовать поиск нужной строки в ComboBox с помощью компонента FindDialog. Подскажите как...

Нахождение определителя
Всем доброго времени суток) Помогите пожалуйста - я все никак не могу реализовать в делфи алгоритм...

Вычисление определителя
У меня есть программа, которая вычисляет определитель матрицы пошагово. Все замечательно, но нет...

0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.04.2017, 15:46

Поиск в StringGrid через edit
Всем доброго времени суток. У меня возникли сложности с заданием в колледже. У меня есть stringgrid...

Поиск в Delphi7 через Edit
Мне нужно сделать так чтоб через Edit происходил поиск клиента и в DBgrid появлялись те клиенты у...

Поиск на сайте через делфи
Как реализовать это? Чтобы получить курс валюты. Хотя бы текстом виде


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

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru