gpt4 book ai didi

matlab - 用于代码生成的 matlab 中具有多个匹配项的 switch-case

转载 作者:行者123 更新时间:2023-12-04 23:44:34 25 4
gpt4 key购买 nike

以下代码是有效的matlab sytax来检查是否b匹配 a 中的任何元素.但是,如果代码用于代码生成(即 simulink),则会出现错误:

'code generation only supports cell operations for varargin and varargout  

您可以通过添加 %#codegen 来检查这一点。在脚本的顶部。)
a={2 3};
b=3;
switch b
case a
disp yay
otherwise
disp boo
end

我应该怎么做才能匹配 case 中的多个模式代码生成兼容代码中的语句?

以下对我不起作用:
case a(1) || a(2) %//with a=[2, 3] above, since cells not allowed

case a(:)

最佳答案

Matlab 编码器不支持“元胞数组”,并且它可以处理的函数集有限。记得比 C不如 Matlab 灵活,特别是关于 type它处理的数据。 C不做动态类型(一个结构应该定义一次并且定义不能在代码中改变)。所以Matlab不能让你使用cell array这是非常松散的类型以及您将添加到 cell 的下一个元素的位置数组将与其他类型的类型不同。

因此,在某些情况下,如果您希望将 Matlab 转换为可能的内容,则您必须为 Matlab 明确说明 C语。

对于您的情况,不同的选择:

直接在 case 中显式列表陈述

如果您不必重复使用 a比较频繁,可以替换case a带有显式列表,如 case {2,3,4,5} :

function test_coder(b)
switch b
case {2,3,4,5}
disp yay
otherwise
disp boo
end

它看起来像一个元胞数组,但它不是。因为它足够显式(变量只保存 4 double 类型)Matlab 将在内部使用一个数组并比较 b到每个元素(它将“扩展” case 语句)。确实,这部分生成的代码看起来像(纯 C 方式):
  guard1 = FALSE;
switch ((int32_T)emlrtIntegerCheckFastR2012b(b, &emlrtDCI, emlrtRootTLSGlobal))
{
case 2:
guard1 = TRUE;
break;

case 3:
guard1 = TRUE;
break;

case 4:
guard1 = TRUE;
break;

case 5:
guard1 = TRUE;
break;
... // and so on

使用 ismember与数组。

函数 ismember supported by the code generator .所以下面的代码也有效:
function test_coder(b)

a=[2 3 4 5] ; %// define array "a"
c=[8 9 10] ; %// define array "c"

if ismember(b,a)
disp yay
elseif ismember(b,c)
disp youhou
else
disp boo

end

但是请注意,编码器需要将数组发送到 ismember进行排序,否则会抛出错误。

如果您有很多比较要做,这会起作用,但是考虑到生成的代码的复杂性,我建议使用 ismember只有在你真正需要的时候。
当您的案例足够简单时,我建议您明确声明 cases (如果需要,可以使用 {...}“快捷方式”。

还要注意始终查看您生成的代码:
在初始示例中,当您指定 b=3 时在代码中,Matlab 检测到,检测到代码总是以这种方式流动,所以它甚至没有编写比较逻辑......生成的代码只是一个快速 disp yay ...

我不得不放置 b作为让 Matlab 实际编码比较逻辑的输入。要编译上面的代码,您必须指定输入变量 b 的类型。将会。所以我使用以下方法编译了上面的内容:
codegen test_coder.m -args {0}

关于matlab - 用于代码生成的 matlab 中具有多个匹配项的 switch-case,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31647777/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com