|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Рекуррентное нахождение определителя матрицы по правилу Лапласа
Здравствуйте!
В ходе работы над моей программой, у меня возникло много проблем с динамическими массивами. Дело в том, что я хочу задать рекуррентную функцию для нахождения определителя матрицы любого размера по правилу Лапласа. В принципе с самим алгоритмом мне все ясно, если заменить динамические массивы на статические, то всё нормально работает. Однако я совсем не понимаю как это сделать через динамические массивы. Подскажите, что не так в моём коде. =D Код:
program LaplasRule; {$APPTYPE CONSOLE} uses SysUtils; var arr:array of array of real; {исходная матрица} det:integer; function lap(arr:array of array of real): real; {собственно тут ошибка} var i,j,l,s:integer; {i-строка; j-столбец; l-столбец, по которуму расскладываем; s-размер исходной матрицы} brr:array of array of real; {матрица алгеброического дополнения} begin s:=high(arr); if s<>0 then begin setlength(brr,s,s); for l:=0 to s do {выбираем столбец по которому раскладываем} begin for j:=0 to dec(l) do {перенос элементов из исх. матрицы в матрицу алг. доп.} for i:=1 to s do brr[i-1,j]:=arr[i,j]; for j:=inc(l) to s do for i:=1 to s brr[i-1,j-1]:=arr[i,j]; lap:=arr[1,l]*lap(brr)*intpower(-1,l+1)+lap end end else lap:=arr[1,1] {для случая когда матрица 1x1 :3} end; begin setlength(arr,4,4); {исходная матрица} arr[0,0]:=3; arr[0,1]:=3; arr[0,2]:=4; arr[0,3]:=2; arr[1,0]:=1; arr[1,1]:=2; arr[1,2]:=2; arr[1,3]:=1; arr[2,0]:=1; arr[2,1]:=3; arr[2,2]:=4; arr[2,3]:=1; arr[3,0]:=0; arr[3,1]:=1; arr[3,2]:=1; arr[3,3]:=1; {определитель исходной матрицы равен 1} det:=lap(arr); writeln(det) {вывод определителя} end. Заранее спасибо, Noqrax. |
#2
|
||||
|
||||
Ну не понимаю я стремления передавать в процедуры/функции указатель на глобальную переменную.
Код:
function lap(locarr : arr) : Single; Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. |
#3
|
||||
|
||||
Код:
uses SysUtils; type TArr:array of array of single; var arr:TArr; {исходная матрица} det:integer; function lap(locarr :TArr): single; ...... |
#4
|
|||
|
|||
1) А разве имеет значение какую переменную я укажу внутри функции?
2) Почему я вообще должен вводить новый тип чтобы использовать в процедуре/функции? 3) И даже если произвести все изменения выводит ошибку о несовместимых типах. Тут я уже совсем не пойму... =/ Последний раз редактировалось Noqrax, 06.04.2012 в 22:19. |
#5
|
||||
|
||||
Цитата:
Цитата:
Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. |
#6
|
|||
|
|||
Уверен? Конечно, потому, что первым делом я написал программу со статическими массивами. Самое интересное, что я использовал глобальные переменные в задании функции и это мне ничем не помешало написать рабочую программу. Может это и дурной тон, но лично я в этом не вижу смысла, если работает и так. Да и поменять single на real не так важно.
Что касается остальных недочетов... Да я мог что-то из-за невнимательности не дописать: Код:
for j:=inc(l) to s do for i:=1 to s brr[i-1,j-1]:=arr[i,j]; |
#7
|
||||
|
||||
Ну тогда с вами всё ясно:
Код:
for j:=0 to dec(l) Код:
s:=high(arr); ... setlength(brr,s,s); Код:
lap:=arr[1,l]*lap(brr)*intpower(-1,l+1)+lap это вообще шедевр программирования Код:
det:=lap(arr); writeln(det) {вывод определителя} P.S. Уважаемый, идите пудрить мозги в другое место. Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. |
#8
|
|||
|
|||
To angvelem
Уважаемый, Вы хотя бы день можете провести без оскорблений и переходов на личности на форуме? |
Этот пользователь сказал Спасибо nixel за это полезное сообщение: | ||
Noqrax (07.04.2012)
|
#9
|
|||
|
|||
Спасибо за найденные ошибки. Но проблему не решило.
Что касается массива brr, то он и должен быть меньше оригинального. Т.к. если раскладывать по одной строке то в качестве алг. дополнения будет выступать матрица меньшей размерности. Вот исправленная версия: Код:
program LaplasRule; {$APPTYPE CONSOLE} uses SysUtils,Math; type darr = array of array of single; var arr:darr; {исходная матрица} det:real; function lap(crr:darr): single; {собственно тут ошибка} var i,j,l,s:integer; {i-строка; j-столбец; l-столбец, по которуму расскладываем; s-размер исходной матрицы} brr:array of array of single; {матрица алгеброического дополнения} begin s:=high(crr); if s<>0 then begin setlength(brr,s,s); for l:=0 to s do {выбираем столбец по которому раскладываем} begin for j:=0 to l-1 do {перенос элементов из исх. матрицы в матрицу алг. доп.} for i:=1 to s do brr[i-1,j]:=crr[i,j]; for j:=l+1 to s do for i:=1 to s do brr[i-1,j-1]:=crr[i,j]; lap:=crr[1,l]*lap(brr)*intpower(-1,l+1)+lap end end else lap:=crr[1,1] {для случая когда матрица 1x1 :3} end; begin setlength(arr,4,4); {исходная матрица} arr[0,0]:=3; arr[0,1]:=3; arr[0,2]:=4; arr[0,3]:=2; arr[1,0]:=1; arr[1,1]:=2; arr[1,2]:=2; arr[1,3]:=1; arr[2,0]:=1; arr[2,1]:=3; arr[2,2]:=4; arr[2,3]:=1; arr[3,0]:=0; arr[3,1]:=1; arr[3,2]:=1; arr[3,3]:=1; {определитель исходной матрицы равен 1} det:=lap(arr); writeln(det) {вывод определителя} end. Здесь компилятор выдает: Код:
lap:=crr[1,l]*lap(brr)*intpower(-1,l+1)+lap end Код:
[Error] LaplasRule.dpr(34): Incompatible types [Error] LaplasRule.dpr(35): Not enough actual parameters |
#10
|
|||
|
|||
Цитата:
Попробуйте lap без параметров заменить на Result. |
#11
|
|||
|
|||
Вторая ошибка решилась.
Но по-прежнему ошибка несовместимости данных. |
#12
|
|||
|
|||
Цитата:
Тогда компилятору нужно будет расширять инт до сингл, а не пытаться изменить тип возвращаемого функцией значения, |
#13
|
|||
|
|||
Я нашел проблему. Она банальная. Заменил brr: array of array of single;
на brr: darr; и программа наконец скомпилировалась. Но теперь новая проблема. Программа считает, что рекурсия бесконечна, хотя это не так. (Ну или должно быть не так =3) |
#14
|
|||
|
|||
Цитата:
|
#15
|
||||
|
||||
Цитата:
Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. |