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}