Почему эта программа Scilab для поиска детерминанта рекурсивно не работает? - PullRequest
0 голосов
/ 19 ноября 2018

Я пытаюсь найти определитель матрицы $ N \ timesN $.Вот мой код:

clc
function determinant=take_detm(A)
order=sqrt(length(A))
disp(order)
if order==2 then 
    determinant=A(1,1)*A(2,2)-A(1,2)*A(2,1);

else

    s=0
    for i=1:order
        s=s+((-1)^(i+1))*A(1,i)*take_detm(A(:,i)=[]);//deleting 1st row and a column in the recursive call
    end
    determinant=s

end
endfunction
matr=input("Enter a matrix")
printf (string(take_detm(matr)))

Вот проблема: Когда я запускаю код и вводим матрицу как: [1 2 3 4; 5 6 7 8; 9 10 11 12; 13 14 15 16]консоль печатает 4 (заказ) и программа зависает.Я получаю то синее кольцо Windows 7 и через некоторое время появляется сообщение о том, что Scilab 6.0.1 перестал работать.Есть ли проблема с алгоритмом или это что-то еще?PS-начальный уровень

Ответы [ 2 ]

0 голосов
/ 02 декабря 2018

Хорошо, поэтому я уверен, что получил это, поэтому отвечаю на свой вопрос.

Если вы хотите удалить строку ИЛИ столбца в Scilab, вы можете назначить его для [].Следующий пример иллюстрирует, как это работает.Рассмотрим матрицу

A=[1 2 3 4; 5 6 7 8; 9 10 11 12; 13 14 15 16]

, которая печатается в консоли как

A  = 

   1.    2.    3.    4. 
   5.    6.    7.    8. 
   9.    10.   11.   12.
   13.   14.   15.   16.

Если вы хотите удалить первую строку, команда будет

    A(1,:)=[]
 A  = 

   5.    6.    7.    8. 
   9.    10.   11.   12.
   13.   14.   15.   16.

Вы простоприсвойте первую строку пустой матрице.Точно так же, если вы хотите удалить 2-й столбец, вы назначаете его пустой матрице:

A(:,2)=[]
A  = 

   5.    7.    8. 
   9.    11.   12.
   13.   15.   16. 

(Обратите внимание, что операция выполняется с обновленной матрицей - т.е. 1-я строка удалена) Но если вы хотитеубрав 1-ю строку и 2-й столбец, вы не можете написать:

A(1,2)=[]

Scilab говорит:

Submatrix incorrectly defined.

Вот альтернативное решение с использованием присваиванияпустая матрица: общая идея: мы выполняем 2 операции одну за другой: удаляем 1-ю строку, а затем i-й столбец.Отправка кода только для else part:

else

    s=0
    first_row_removed=A //taking a backup of A and then...
    first_row_removed(1,:)=[] //...removing the 1st row
    for i=1:order
        column_i_removed=first_row_removed //taking a backup of the 1st-row-removed matrix...
        column_i_removed(:,i)=[] //... and then deleting column i
        s=s+((-1)^(i+1))*A(1,i)*take_detm(column_i_removed); //recursive call
    end
    determinant=s

end //of else   

Важно отметить, что выполнение присваивания пустой матрице вносит изменения в саму исходную матрицу.Следовательно, для каждой итерации цикла for мы должны убедиться, что мы выполняем операцию удаления столбца i-го столбца над матрицей, удаленной из 1-й строки, а не над матрицей, в которой i-й столбец был удален в предыдущей итерации цикла.Следовательно, строка

column_i_removed=first_row_removed

должна быть внутри цикла for.

0 голосов
/ 22 ноября 2018

Проблема связана с инструкцией A (:, i) = []. назначение [] работает только для набора полных строк или набора полных строк, поэтому ваша инструкция просто удалила i-й столбец матрицы A (в результате получилась прямоугольная матрица)

Вы можете решить проблему с помощью

    Ai=A(2:order,[1:i-1 i+1:order])//deleting 1st row and  column i
    s=s+((-1)^(i+1))*A(1,i)*take_detm(Ai); //recursive call

Обратите внимание, что функция Scilab det гораздо более точная и эффективная

...