7

我正在寻找一个在 Matlab 中用于错误消息的函数,如下所示:

error(['Invalid value for someVariable: ' wantedFunction(someVariable)]);

我希望wantedFunction能够同时使用字符串、数组、单元格数组,最好是结构数组。

目前,我正在使用num2str,但这不适用于单元格。我以为我想要的可以用 来完成sprintf,但我还没有弄清楚怎么做。我想我可以编写自己的函数,但如果在 Matlab 中已经有办法做到这一点,那将是多余的。有任何想法吗?

4

4 回答 4

14

是的,虽然这并不简单。您必须将 与disp结合使用evalc

string = evalc(['disp(someVariable)'])

您可以将其转换为更易于管理的形式:

toString = @(var) evalc(['disp(var)']);

因此,对于您的示例:

>> var = {rand(3,1), 'A', struct('test', 5)};
>> error(['Invalid value for var: ' toString(var)])

??? Invalid value for var:     [3x1 double]    'A'    [1x1 struct]
于 2012-10-09T12:29:43.433 回答
2

想一想,我记得很久以前做过的事情与 angainor 在他的回答中所做的非常相似。我会在这里为任何有兴趣将任意事物转换为字符串的人发布它,并且通常可以更好地控制转换的完成方式。

它支持空、逻辑、字符、函数句柄、数字、单元格、结构(数组)和用户定义的类(下次更新中的稀疏数组)。

编辑:我已将此作为更新的模板,我最终将其放在文件交换中。随意尝试和修改以满足您的需求。

于 2012-10-09T14:55:49.307 回答
2

不,没有这样的功能。我遇到了类似的问题,所以这是我使用的一个非常基本的功能。意识到它并不完整。例如,它不会以有意义的方式输出结构的字段,但可以轻松添加。您可以将其视为基本实现并满足您的需求。

function ret = all2str(param)
if isempty(param)
    if iscell(param)
        ret = '(empty cell)';
    elseif isstruct(param);
        ret = '(empty struct)';
    else
        ret = '(empty)';
    end
    return;
end

if ischar(param)
    ret = param;
    return;
end

if isnumeric(param)
    ret = num2str(param);
    return;
end

if iscell(param)
    ret = all2str(param{1});
    for i=2:numel(param)
        ret = [ret ', ' all2str(param{i})];
    end
    return;
end

if isstruct(param)
    ret = '(structure)';
    return;
end
end
于 2012-10-09T11:51:12.323 回答
2

看起来很奇怪,但是

str = matlab.unittest.diagnostics.ConstraintDiagnostic.getDisplayableString(value)

而是使用那种不美观evalc(disp())的方法为您完成工作。

于 2017-10-31T08:15:43.237 回答