【问题标题】:Is there a Matlab function to convert any data structure to a string?是否有 Matlab 函数可以将任何数据结构转换为字符串?
【发布时间】:2012-10-09 10:22:15
【问题描述】:

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

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

我希望wantedFunction 能够同时获取字符串、数组、元胞数组,最好是结构数组。

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

【问题讨论】:

  • 看看我最新的编辑(toString.m)。这是在获得批准后放置在文件交换中的版本。

标签: matlab


【解决方案1】:

是的,尽管它并不简单。您必须将dispevalc 结合使用:

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]

【讨论】:

  • 谢谢!这就是我一直在寻找的:最简单的方法。为了避免制作自制的 toString 函数(无论是一行还是一个完整的函数),我想可以这样做:disp(someVariable); error('... is an invalid value for someVariable');
  • 不过,我最终在您的其他答案中使用了该功能:)
  • 这不会打印嵌套结构
  • @Dims:是的。为此,我将参考处理更一般情况的FEX contribution
【解决方案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

【讨论】:

  • 嗯...我似乎没有mall2str...这是 R2012 的问题吗?另外:为什么不使用fieldnames 等打印结构?你为什么不打印'[]''{}' 来获取空瓶?
  • @RodyOldenhuis 你没有它,因为我写它是为了内部使用。它绝不是完美的。正如我在回答中所说,我不处理结构。因为我从来不需要那个特定的功能;)但可以肯定的是,它可以很容易地实现。我打印的东西对我来说很方便。
  • @RodyOldenhuis 哦,那里有一个错字。我将mall2str 重命名为all2str,但不是在所有地方......谢谢
  • 看我的第二个回答,告诉我你的想法。
  • 谢谢,安盖诺。编写一个专用函数可能是最好的方法。
【解决方案3】:

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

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

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

【讨论】:

  • +1 他们的开始很相似,只是我刚开始就放弃了,而你似乎把它推得更远了;)
  • 太棒了!我想如果一个人想要正确地做到这一点,这就是使用的功能。
  • 酷!我很乐意使用它。你做了相当多的工作......现在这样的功能终于存在了:)
【解决方案4】:

看起来很奇怪,但是

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

使用不美观的evalc(disp()) 方法为您完成这项工作。

【讨论】:

    猜你喜欢
    • 2011-04-01
    • 2021-04-23
    • 2023-03-14
    • 1970-01-01
    • 2011-03-30
    • 2022-11-23
    • 2023-04-08
    • 1970-01-01
    相关资源
    最近更新 更多