String 如何在嵌入式Matlab中使用变长字符串的开关结构?

String 如何在嵌入式Matlab中使用变长字符串的开关结构?,string,matlab,switch-statement,matlab-coder,String,Matlab,Switch Statement,Matlab Coder,我从来都不太喜欢嵌入式MATLAB,这正是因为我将要问的情况:)根据我的经验,转换到嵌入式MATLAB通常比简单地用C重新编写要花很多精力(当你足够了解C和MatlabAPI时) 但是,我想有些事情是无法避免的 不管怎样,这是我的问题。在嵌入式MATLAB中,与R2010a一样,您不能执行以下操作: for ii = <some range> parameter = <some string> switch parameter ca

我从来都不太喜欢嵌入式MATLAB,这正是因为我将要问的情况:)根据我的经验,转换到嵌入式MATLAB通常比简单地用C重新编写要花很多精力(当你足够了解C和MatlabAPI时)

但是,我想有些事情是无法避免的

不管怎样,这是我的问题。在嵌入式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
当然没有帮助:

??? Expected a numeric value. Found a mxArray
即使将字符串的大小限制为已知的常量长度也没有帮助:

parameter = char_array(ii, 1:4);  % <--- NOTE: length is 4 characters

switch parameter
    ...
end

参数=字符数组(ii,1:4);% 不幸的是,除了你提到的其他方法外,我不知道还有其他方法

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

就我个人而言,我同意你的第二种方法。它很难看,但可读性强

因为你说你只需要考虑每个字符串的前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

在我看来,这不是真正可读的,如果有大量字符串,可能会浪费很多时间。你可能会想到一些更具性能的东西,但我还是认为这是一个黑客。(这并不是你一直在寻找的优雅解决方案。)@user1884905:不,我试过了……事实上,在我的实际函数中,前4个字符唯一地确定字符串,所以我试着只使用前4个字符;没有运气,同样的错误信息。谢谢,这是我害怕的。我用fugly
if-elseif-…-else-end
构造解决了这个问题,我认为这确实是最可读的替代方案。将字符串映射到任意数字感觉有点像强迫大众甲壳虫进入低地球轨道……只是稍微超出了它的设计限制:)
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