3

通常,我的函数包含一个包含少量有效选项的字符串参数。例如,它可能表示类似于 的最后一个参数的模式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 代码分析器已经开始警告不要使用sprintf. 它仍然有效,但它可能不是一种受支持的方式,我不知道它是否会在未来继续有效,所以我不愿意简单地忽略或抑制警告。

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

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

4

4 回答 4

6

您可以使用sprintf这种方式,使用列表

sprintf('%s ', valid_modes{:})

这样可行。我真的很惊讶您可以按照自己的方式编写它。我得到一个错误。

现在走更复杂的路线:) 你总是可以这样做

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

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

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

 rectangular gaussian 
于 2012-10-03T17:14:26.840 回答
3

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

error(['atmlab:' mfilename ':invalid'], 'Invalid mode: %s. Valid modes: %s\n', mode, cell2mat(cellfun(@(x) [ x ' ' ], valid_modes, 'UniformOutput', false)));
于 2012-10-03T18:37:30.877 回答
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

请注意,如果您只想显示元胞数组,而不是将其作为字符串传递,则可以使用celldispfunction.

于 2012-10-03T16:37:02.303 回答
1

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

C = {'Newton','Gauss','Euclid','Lagrange'};  
str = strjoin(C,', ')
于 2015-03-26T15:22:47.567 回答