主要内容

已达到编译时递归极限

问题

你看到一条消息,如:

达到编译时间递归限制。功能'foo'的输入1的大小或类型可能会在每个呼叫中​​更改。
达到编译时间递归限制。功能'foo'的输入#1的值可能会在每个呼叫中​​更改。

原因

通过编译时间递归,代码生成器产生多个版本的递归函数,而不是在生成的代码中产生递归函数。这些版本称为功能专业。代码生成器无法在MATLAB中使用编译时间递归以进行递归函数®代码,因为函数专门化的数量超过了限制。

万博 尤文图斯

要解决此问题,请尝试其中一个解决方案:万博 尤文图斯

强制运行时间递归

通过将输入值视为不分子的输入值来强制运行时间递归

考虑此功能:

功能y = call_recfcn(n) A = ones(1,n);x = 100;y = recfcn(a,x);结尾功能y = recfcn(a,x)如果大小(2)= = 1 | | x = y = 1 = (1);别的Y = A(1)+ RECFCN(A(2:结束),x-1);结尾结尾

第二个输入recfcn.具有常量值100.代码生成器确定递归调用的数量是有限的,并尝试生成100份recfcn..这种专门化的数量超过了编译时递归限制。要强制执行运行时递归,请使用Coder.ignoreConst.

功能y = call_recfcn(n) A = ones(1,n);x =代码服务器.ignoreConst(100);y = recfcn(a,x);结尾功能y = recfcn(a,x)如果大小(2)= = 1 | | x = y = 1 = (1);别的Y = A(1)+ RECFCN(A(2:结束),x-1);结尾结尾

如果代码生成器不能确定递归调用的数量是有限的,它将生成一个运行时递归函数。

通过制作输入可变大小来强制运行时间递归

考虑此功能:

功能z = call_mysum(a)%#codegen.z = mysum(a);结尾功能y = mysum(a)编码器.inline('绝不');如果尺寸(a,2)== 1 y = a(1);别的Y = A(1)+ MySUM(A(2:结束));结尾结尾

如果输入到迈尔姆斯是固定的大小,代码生成器使用编译时间递归。如果一种足够大,功能专业数量超出编译时限。要使代码生成器使用运行时转换,请使输入迈尔姆斯通过使用可变大小编码器.Varsize.

功能z = call_mysum(a)%#codegen.b = a;编码器.Varsize('B');z = mysum(b);结尾功能y = mysum(a)编码器.inline('绝不');如果尺寸(a,2)== 1 y = a(1);别的Y = A(1)+ MySUM(A(2:结束));结尾结尾

增加编译时间递归限制

默认的编译时间递归限制为50足够大,对于需要编译时间递归的大多数递归函数。通常,增加限制不会解决问题。但是,如果您可以确定递归调用的数量,并且您希望编译时递归,请增加限制。例如,考虑此功能:

功能z = call_mysum()%#codegen.B = 1:125;z = mysum(b);结尾功能y = mysum(a)编码器.inline('绝不');如果尺寸(a,2)== 1 y = a(1);别的Y = A(1)+ MySUM(A(2:结束));结尾结尾

您可以确定代码生成器产生125份迈尔姆斯功能。在这种情况下,如果要编译时递归,将编译时间递归限制增加到125。

增加编译时间递归限制:

  • 在命令行处,在代码生成配置对象中,增加了值compiletimerecursionlimit.配置参数。

  • 在里面Matlab Coder™应用程序,增加值编译时间递归限制环境。

相关的话题