我找不到如何强制Matlab编码器使参数大小可变而不是固定的。
这是一个MCVE:
功能码:
function [sz] = my_varsize(x)
sz = length(x);
end
Matlab编码器中使用的示例主程序:
samp = 100;
x = zeros(1,samp);
sz = my_varsize(x);
display(sz);
然后,Matlab编码器生成x大小为(1x100)的C / C++代码。
我可以从GUI手动将变量大小从
1x100
更改为1x:Inf
,效果很好,但是我更喜欢Matlab编码器自动执行此操作。我试图在函数和主程序中都添加coder.varsize('x',[1,inf]);
和coder.typeof(x,[1,inf]);
,但是没有一个具有预期的行为。编辑:基于Ryan的评论,我试图用不同大小的不同对象调用my_varsize,以查看Matlab是否意识到那应该使用可变大小:
samp = int64(round(rand()*100));
x = zeros(1,samp);
sz = my_varsize(x);
display(sz);
samp = int64(round(rand()*100));
x = zeros(1,samp);
sz = my_varsize(x);
display(sz);
然后,生成的代码使用可变大小61(两个
rand()
调用的最大结果)[1,:61]
,而我需要[1,:inf]
,以便生成的C / C++代码可用于任何输入!
最佳答案
大概您正在使用MATLAB Coder应用程序中的自动定义功能。这样做是运行您提供的脚本并监视对函数my_varsize
的输入。让我们举一个具体的例子:
函数my_varsize.m
function [sz] = my_varsize(x)
sz = length(x);
end
测试脚本
my_varsize_tb.m
samp = 20;
x = zeros(1,samp);
sz = my_varsize(x);
display(sz);
samp = 37;
x = zeros(1,samp);
sz = my_varsize(x);
display(sz);
在这里,运行
my_varsize_tb
,并且Coder检测到2个对my_varsize
的调用。第一个采用1-by-20
double 数组。第二个采用1-by-37
数组。因此,它计算出输入必须为1-by-:37
。由于只能通过这种方式进行有限数量的调用,因此只能确定输入具有有限的上限。然后,您可以在Coder App中将大小调整为
1-by-:Inf
:更多信息
有一个命令行功能提供与您可能正在使用的相同的行为:
>> t = coder.getArgTypes('my_varsize_tb','my_varsize')
t =
1×1 cell array
{1×1 coder.PrimitiveType}
>> t{1}
ans =
coder.PrimitiveType
1×:37 double
您可以类似地调整该大小:
>> inputType = coder.resize(t{1},[1,Inf])
inputType =
coder.PrimitiveType
1×:inf double
>> codegen my_varsize -args inputType
与
codegen
命令一起使用。最后,鉴于您有一个简单的功能,您可以执行以下操作:
t = coder.typeof(1, [1,Inf]);
codegen my_varsize -args t
coder.typeof
采用第一个输入来确定它是一个真正的double
及其大小。当您传递第二个参数时,该参数将覆盖大小,从而在这种情况下按预期方式生成1-by-:Inf
。
关于c++ - Matlab编码器:如何强制变量具有变量:inf大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61520582/