matlab中多匹配开关盒的代码生成

matlab中多匹配开关盒的代码生成,matlab,switch-statement,code-generation,simulink,matlab-coder,Matlab,Switch Statement,Code Generation,Simulink,Matlab Coder,以下代码对检查b是否与a中的任何元素匹配有效。但是,如果代码用于代码生成(即simulink),则会出现以下错误: 'code generation only supports cell operations for varargin and varargout 您可以通过在脚本顶部添加%#codegen来检查这一点。) 在与代码生成兼容的代码中,如何匹配case语句中的多个模式 以下内容不适用于我: case a(1) || a(2) %//with a=[2, 3] above, si

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

'code generation only supports cell operations for varargin and varargout  
您可以通过在脚本顶部添加
%#codegen
来检查这一点。)

在与代码生成兼容的代码中,如何匹配
case
语句中的多个模式

以下内容不适用于我:

case a(1) || a(2) %//with a=[2, 3] above, since cells not allowed

case a(:)

Matlab编码器不支持“单元阵列”,并且它可以处理的函数集有限。请记住,
C
不如Matlab灵活,特别是在处理的数据类型方面<代码>C不执行动态类型(结构应定义一次,且定义不能在代码中更改)。因此,Matlab不允许您使用类型非常松散的
单元数组
,您要添加到
单元
数组中的下一个元素的类型与其他元素的类型不同

因此,在某些情况下,如果您希望Matlab将其转换为可能的
C
语言,那么您必须为Matlab显式地显示内容

对于您的情况,有不同的选项:

直接在
case
语句中显式列出 如果您不必太频繁地重复使用
a
进行比较,您可以用一个显式列表替换
案例a
,如
案例{2,3,4,5}

function test_coder(b)
switch b
    case {2,3,4,5}
        disp yay
    otherwise
        disp boo
end
它看起来像一个单元格数组,但它不是。因为它足够明确(变量只包含4个
double
type),所以Matlab将在内部使用一个数组,并将
b
与每个元素进行比较(它将“展开”
case
语句)。事实上,这部分生成的代码看起来像(纯
C
way):


ismember
与数组一起使用。 功能是。因此,下面的代码也起作用:

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

当您的案例足够简单时,我建议您使用
案例的显式声明(如果需要,请使用
{…}
“快捷方式”)


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

我必须将
b
作为输入,才能让Matlab实际编写比较逻辑。要编译上面的代码,您必须指定输入变量
b
的类型。因此,我使用以下方法编译了上面的代码:

codegen test_coder.m -args {0}

我认为Matlab Coder非常有限,因此您必须更改代码以使其工作。您可以使用if语句代替switch语句,它应该工作。我认为switch语句需要多个实例的单元格值。
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
codegen test_coder.m -args {0}