【问题标题】:Matlab coder: How to force a variable to have variable :inf sizeMatlab 编码器:如何强制变量具有变量:inf 大小
【发布时间】:2020-04-30 09:50:45
【问题描述】:

我找不到如何强制 Matlab 编码器使参数大小可变而不是固定。

这是一个 MCVE:

功能代码:

function [sz] = my_varsize(x)
    sz = length(x);
end

Matlab coder 中使用的示例主程序:

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.varsize 似乎是为此而生的,但我无法让它发挥作用!
  • 从您的示例代码中,x 的大小只有 100。所以 MATLAB Coder 只是丢弃了 coder.varsize。如果您将该数组包含在一个更复杂的示例中,该示例实际上分配了一个非常量或变化的大小,它将坚持下去。否则,您能否扩展您的示例以显示您想要实现的目标?
  • @RyanLivingston:查看我的编辑,即使有很多输入,它也不使用:inf 作为上限。

标签: c++ matlab matlab-coder


【解决方案1】:

大概您正在使用 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 检测到对 my_varsize 的 2 次调用。第一个采用 1-by-20 双数组。第二个采用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

【讨论】:

  • 没错,我正在使用“自动定义功能”。我目前按照您的建议将大小调整为:inf。当我从 GUI 运行编码器时,我没有运行 codegen。代码中是否没有标志我可以添加以具有“自动定义功能”了解我想要一个:inf 上限?这就是我一直在寻找的,我相信使用coder.varsize 是可行的,正如文档所建议的那样(mathworks.com/help/fixedpoint/ref/coder.varsize.html):“声明指示代码生成器......”,“......还指定了一个上限”。但我无法让它工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-13
相关资源
最近更新 更多