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