Вы видите одно из этих сообщений:
All outputs must be assigned before any run-time recursive call. Output 'y' is not assigned here.
Simulink does not have enough information to determine output sizes for this block
Рекурсия во время выполнения производит рекурсивную функцию в сгенерированном коде. Генератор кода не может использовать рекурсию во время выполнения в рекурсивной функции в вашем коде MATLAB®, потому что выход не присвоен перед первым рекурсивным вызовом.
Перепишите код так, чтобы он присвоил выход перед рекурсивным вызовом.
В следующем коде, операторе y = A(1)
присваивает значение выходу y
. Этот оператор происходит после рекурсивного вызова y = A(1)+ mysum(A(2:end))
.
function z = call_mysum(A) B = A; coder.varsize('B'); z = mysum(B); end function y = mysum(A) coder.inline('never'); if size(A,2) > 1 y = A(1)+ mysum(A(2:end)); else y = A(1); end end
Перепишите код так, чтобы присвоение y = A(1)
происходит в if
блокируйтесь и рекурсивный вызов происходит в else
блок.
function z = call_mysum(A) B = A; coder.varsize('B'); z = mysum(B); end function y = mysum(A) coder.inline('never'); if size(A,2) == 1 y = A(1); else y = A(1)+ mysum(A(2:end)); end end
В качестве альтернативы перед if
блокируйте, добавьте присвоение, например, y = 0
.
function z = call_mysum(A) B = A; coder.varsize('B'); z = mysum(B); end function y = mysum(A) coder.inline('never'); y = 0; if size(A,2) > 1 y = A(1)+ mysum(A(2:end)); else y = A(1); end end
В следующем коде, rec1
вызовы rec2
перед присвоением y = 0
.
function z = callrec(n) z = rec1(n); end function y = rec1(x) %#codegen if x >= 0 y = rec2(x-1)+1; else y = 0; end end function y = rec2(x) y = rec1(x-1)+2; end
Перепишите этот код так, чтобы в rec1
, присвоение y = 0
происходит в if
блокируйтесь и рекурсивный вызов происходит в else
блок.
function z = callrec(n) z = rec1(n); end function y = rec1(x) %#codegen if x < 0 y = 0; else y = rec2(x-1)+1; end end function y = rec2(x) y = rec1(x-1)+2; end