通常,我的函数包含一个字符串参数,该参数具有少量有效选项。例如,它可能表示类似于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)')
,但这个解决方案让我呕吐。
如何方便,优雅地显示字符串单元格数组的值?
答案 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)
这是使用cellfun
和cell2mat
的单线解决方案。在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,', ')