以方便、优雅和稳定的方式显示单元格字符串数组

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,Matlab 代码分析器已经开始警告这种使用方式。它仍然可以工作,但可能不是一种受支持的方式,我不知道它将来是否会继续工作,所以我不愿意简单地忽略或抑制警告。
另一种解决方案是使用 evalc('disp(valid_modes)'),但这个解决方案让我感到恶心。
如何方便、优雅地显示一个字符串单元数组的值?
4个回答

6
您可以使用sprintf以这种方式,使用列表
sprintf('%s ', valid_modes{:})

可以,我很惊讶你能这样编写。我得到了一个错误。

现在进入更加复杂的路线:) 您始终可以这样做。

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

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

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

 rectangular gaussian 

嗯,关于这个错误,我可能和其他事情搞混了。我不确定我过去做了什么... - gerrit

3
这是一个使用cellfuncell2mat的一行代码解决方案。已在MATLAB R2012a中测试过。
error(['atmlab:' mfilename ':invalid'], 'Invalid mode: %s. Valid modes: %s\n', mode, cell2mat(cellfun(@(x) [ x ' ' ], valid_modes, 'UniformOutput', false)));

1

自从 Matlab 的最新版本发布(我想是从2013b开始),出现了一个名为strjoin的新函数,它可以将单元数组中的字符串连接起来。例如:

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

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函数。该函数与您的需求相符。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接