4

我从不太喜欢嵌入式 MATLAB,正是因为我将要问的情况 :) 根据我的经验,转换到嵌入式 MATLAB 通常比简单地用 C 重写东西要付出更多的努力(当你知道 C 和MATLAB API 足够好)。

但是哦,好吧,我想有些事情是无法避免的。

无论如何,这是我的问题。在嵌入式 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

where<some string>每次迭代都会改变。这是因为字符串的长度parameter是可变的,这意味着这个定义parameter超出了 Embedded 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

但没有运气:

???非常数表达式或空矩阵。这个表达式必须是常量,因为它的值决定了某个表达式的大小或类别。对常量字符串的限制仅适用于字符串上的开关,而不适用于数字上的开关。

我看到了两种方法:

  1. 将所有允许的字符串映射到某个数字表示,并在数字上使用开关
  2. strcmp(i)在一个巨大的if-elseif-elseif-...-else-end结构内使用。

恕我直言,两者都同样丑陋,2.可能更丑陋(你需要另一个外在功能,strcmp)......

那么,有什么优雅的方法可以解决这个问题吗?

4

1 回答 1

1

不幸的是,除了您提到的替代方法外,我不知道任何其他方法。

更糟糕的是,MATLAB 没有内置的 char 数组来加倍标量散列函数。因此,如果要将字符串映射到数字,则需要提供自定义哈希函数。

就个人而言,我会选择你的第二种方法。它丑陋但可读。

由于您说您只需要考虑每个字符串的前 4 个字符,因此将字符串映射到数字的另一种选择是通过显式查找:

function y = fcn(u)
%#codegen

    y = u;

    cases = [
        '1111'
        '2222'
        '3333'
    ];

    for i = 1 : 3
        switch i
            case 1                
                p = '1111a';
            case 2
                p = '2222bb';
            otherwise
                p = '3333ccc';
        end      

        for j = 1 : size(cases, 1)
            if isequal(cases(j, 1 : 4), p)
                switch j
                    case 1
                        y = y + 1;
                    case 2
                        y = y + 2;
                    case 3
                        y = y + 3;
                end
            end
        end        
    end
end

在我看来,这不是真正可读的,如果你有大量的字符串,可能会浪费很多时间。你可能会想出一些性能更高的东西,但我仍然认为这是一个 hack。

于 2013-06-12T13:54:38.430 回答