Вы видите одно из этих сообщений:
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