以方便,优雅和健壮的方式显示字符串的单元格数组

时间:2012-10-03 16:31:27

标签: matlab cell-array

通常,我的函数包含一个字符串参数,该参数具有少量有效选项。例如,它可能表示类似于interp1的最后一个参数的模式。当用户传递的值不正确时,我想在错误消息中提供有效选项列表。

目前,我这样解决:

function out = my_func(mode)
valid_modes = {'rectangular', 'gaussian'};
switch mode
    case 'rectangular'
        % do something
    case 'gaussian'
        % do something else
    otherwise
        error(['atmlab:' mfilename ':invalid'], 'Invalid mode: %s. Valid modes: %s', mode, sprintf('%s ', valid_modes))
end

我正在利用的技巧是sprintf可以获取一个单元格数组,然后输出多个字符串的串联。但是,这种行为似乎没有记录,从Matlab 2012b开始,Matlabs Code Analyzer已开始警告sprintf的这种用法。它仍然有效,但它可能不是一种受支持的方式,我不知道它将来是否会继续工作,所以我不愿意简单地忽略或取消警告。

另一个解决方案是使用evalc('disp(valid_modes)'),但这个解决方案让我呕吐。

如何方便,优雅地显示字符串单元格数组的值?

4 个答案:

答案 0 :(得分:5)

您可以使用lists

以这种方式使用sprintf
sprintf('%s ', valid_modes{:})

有效。我真的很惊讶你可以按照你的方式写它。我收到了错误。

现在更复杂的路线:)你可以随时做到这一点

str = [valid_modes{:}]; % that is a string

您只需要在模式名称中包含空格,您可能不想这样做。但是你可以声明它们在第二行包含空格:

valid_modes = {'rectangular'    'gaussian'
               ' '              ' '} 
str = [valid_modes{:}]
ans =

 rectangular gaussian 

答案 1 :(得分:3)

这是使用cellfuncell2mat的单线解决方案。在MATLAB R2012a中测试。

error(['atmlab:' mfilename ':invalid'], 'Invalid mode: %s. Valid modes: %s\n', mode, cell2mat(cellfun(@(x) [ x ' ' ], valid_modes, 'UniformOutput', false)));

答案 2 :(得分:1)

您可以创建一个将单元格数组转换为字符串的函数:

 function st = cell2str(cellStr)
     cellStr= cellfun(@(x){[x ',']},cellStr); %# Add ',' after each string.
     st = cat(2,cellStr{:});  %# Convert to string             
     st(end) = []; %# Remove last ','
 end

请注意,如果您只想显示单元格数组,而不是将其作为字符串传递,则可以使用celldisp函数。

答案 3 :(得分:1)

自Matlab的最新版本(我认为自2013b以来),有一个新函数strjoin,它连接单元格数组中的字符串。例如:

C = {'Newton','Gauss','Euclid','Lagrange'};  
str = strjoin(C,', ')