我从来不太喜欢嵌入式MATLAB,就是因为像我即将要问的情况:)在我的经验中,当你熟悉C语言和MATLAB API时,转换为嵌入式MATLAB往往需要更多的努力比重新用C语言编写。
当然,这并没有帮助:
但是,好吧,我想有些事情是无法避免的。
无论如何,这就是我的问题。在嵌入式MATLAB中(例如在R2010a中),你不能这样做:
for ii = <some range>
parameter = <some string>
switch parameter
case 'first_string'
% do stuff
case 'another_string_that''s_larger_than_first_string'
% do other stuff
end
% ...continue here
end
在每次迭代中,<some string>
都会发生变化。这是因为parameter
字符串的长度是可变的,意味着此定义超出了嵌入式Matlab的能力范围:
??? 非常量表达式或空矩阵。此表达式必须是常量,因为它的值决定了某些表达式的大小或类。对于基于字符串的开关,只有常量字符串才受到限制,而不是数字。
将switch
改为更直接的形式
switch <some string>
...
end
当然,这并没有帮助:
??? Expected a numeric value. Found a mxArray
即使将字符串的大小限制在已知的固定长度内,也无济于事:
parameter = char_array(ii, 1:4); % <--- NOTE: length is 4 characters
switch parameter
...
end
但运气不佳:
??? 非常量表达式或空矩阵。此表达式必须是常量,因为它的值确定了某些表达式的大小或类。对于字符串开关,仅限于常量字符串,而不是数字开关。
我看到两种出路:
- 将所有可允许的字符串映射到某个数字表示,并在数字上使用开关
- 在巨大的
if-elseif-elseif-...-else-end
结构中使用strcmp(i)
在我看来,这两种方法都同样丑陋,第二种可能更丑陋(你需要另一个外部函数 strcmp
)...
那么,有没有任何 优雅 的方法可以解决这个问题?