你看到一条消息,如:
达到编译时间递归限制。功能'foo'的输入1的大小或类型可能会在每个呼叫中更改。
达到编译时间递归限制。功能'foo'的输入#1的值可能会在每个呼叫中更改。
通过编译时间递归,代码生成器产生多个版本的递归函数,而不是在生成的代码中产生递归函数。这些版本称为功能专业。代码生成器无法在MATLAB中使用编译时间递归以进行递归函数®代码,因为函数专门化的数量超过了限制。
要解决此问题,请尝试其中一个解决方案:万博 尤文图斯
对于此消息:
达到编译时间递归限制。功能'foo'的输入#1的值可能会在每个呼叫中更改。
使用此解决方案:
对于此消息:
达到编译时间递归限制。功能'foo'的输入1的大小或类型可能会在每个呼叫中更改。
在里面代码生成报告,看看函数专门化。如果您看到每个函数专门化的参数大小都在变化,请尝试以下解决方案:
考虑此功能:
功能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™应用程序,增加值编译时间递归限制环境。