c++ - Matlab编码器:如何强制变量具有变量:inf大小

标签 c++ matlab matlab-coder

我找不到如何强制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:

Coder app varsize

更多信息

有一个命令行功能提供与您可能正在使用的相同的行为:

>> 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/

相关文章:

c++ - 如何知道连接到 QTcpServer 的客户端是否已关闭连接?

c++ - 在一个 Protocol Buffer 二进制文件中存储多条消息

matlab - Simulink中的三阶速率限制器?如何产生平滑的触发信号?

matlab - 每次迭代后添加到图例

c++ - 使用互斥锁在 2 个进程之间进行屏障同步

c++ - 带指针的模板,创建二维数组

image - HSI 和 YCbCr 之间的差异与肤色相关

c++ - 导入函数 Matlab Coder 和 C++ 可执行文件

c - Matlab Coder 是否仅生成单线程 C 应用程序?

string - Matlab Coder - strcat 函数的替代方案