强制代码生成器使用运行时递归
当你的MATLAB®代码包括递归函数调用,代码生成器使用编译时和运行时递归。与编译时递归,代码生成器创建多个版本的递归函数生成的代码。这些版本被称为功能专门化。与运行时递归,代码生成器产生一个递归函数。如果编译时递归导致太多的运行时递归函数专门化或如果你喜欢,你可以试着强制代码生成器使用运行时递归。试一试这些方法之一:
治疗作为一个非常数的递归函数的输入
考虑一下这个函数:
函数y = call_recfcn (n) = (1, n)的;x = 5;y = recfcn (x);结束函数y = recfcn (A, x)如果大小(2)= = 1 | | x = y = 1 = (1);其他的y = (1) + recfcn((2:结束),x - 1);结束结束
call_recfcn
调用recfcn
第二个参数的值5。recfcn
递归地调用自身,直到x
是1。为每一个recfcn
电话,输入参数x
有不同的价值。代码生成器产生五专门化recfcn
,一个用于每个调用。在生成代码之后,您可以看到代码生成报告的专门化。
力运行时递归call_recfcn
在调用recfcn
,指导代码生成器对输入参数的值x
通过使用作为一个非常数的值coder.ignoreConst
。
函数y = call_recfcn (n) = (1, n)的;x = coder.ignoreConst (5);y = recfcn (x);结束函数y = recfcn (A, x)如果大小(2)= = 1 | | x = y = 1 = (1);其他的y = (1) + recfcn((2:结束),x - 1);结束结束
在您生成代码,代码生成报告。,你只看到一个专业化。
递归函数的输入适应
考虑这段代码:
函数z = call_mysum (A)% # codegenz = mysum(一个);结束函数y = mysum (A) coder.inline (“永远”);如果大小(2)= = 1 y = (1);其他的y = (1) + mysum((2:结束);结束结束
如果输入mysum
是固定大小的,代码生成器使用编译时递归。强制代码生成器使用运行时转换,使输入mysum
适应用coder.varsize
。
函数z = call_mysum (A)% # codegenB =一个;coder.varsize (“B”);z = mysum (B);结束函数y = mysum (A) coder.inline (“永远”);如果大小(2)= = 1 y = (1);其他的y = (1) + mysum((2:结束);结束结束
在递归调用分配输出变量
代码生成器使用编译时递归代码:
函数y = callrecursive (n) x = 10;y = myrecursive (x, n);结束函数y = myrecursive (x, n) coder.inline (“永远”)如果x > 1 y = n + myrecursive (x - 1, n - 1);其他的y = n;结束结束
强制代码生成器使用运行时递归,修改myrecursive
这样的输出y
在递归调用被分配。把作业y = n
在如果
块和递归调用其他的
块。
函数y = callrecursive (n) x = 10;y = myrecursive (x, n);结束函数y = myrecursive (x, n) coder.inline (“永远”)如果x = y = 1 = n;其他的y = n + myrecursive (x - 1, n - 1);结束结束