主要内容

强制代码生成器使用运行时递归

当你的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);结束结束

另请参阅

相关的话题