【问题标题】:Custom display of an object properties in MATLAB在 MATLAB 中自定义显示对象属性
【发布时间】:2016-08-23 00:08:00
【问题描述】:

在 MATLAB 中,我想自定义一个对象,使其与数据类型有关的属性之一将显示一个值(与类型代码相对应的原始数值)及其字符串表示形式,例如: '双'(14)。在下面的代码中,我所说的属性称为datatype。

目前,我已经覆盖了matlab.mixin.CustomDisplay 类并以某种方式对其进行了整理,但我不得不使用字符串变量来合并数字和字符串并形成组合输出。问题是 MATLAB 显示带引号的字符串:

tidx = 
  idx with properties:

    dimensions: 3
      datatype: 'double (14)'
          size: [3 4 5]

这很好,但我不喜欢它。 MATLAB 在此特定属性处显示字符串时有什么方法可以去掉引号?

类定义:

classdef idx < matlab.mixin.CustomDisplay
    properties
        filename
    end

    properties(SetAccess=private)
        dimensions
        datatype
        size 
    end

% ...

    methods(Access=protected)
        function propgrp = getPropertyGroups(app)
            if ~isscalar(app)
                propgrp = ... 
                    getPropertyGroups@matlab.mixin.CustomDisplay(app);
            else
                sizestr = ...
                    sprintf('%s (%d)', app.datatypenum2str(app.datatype), app.datatype);
                propList = struct(...
                    'dimensions',app.dimensions,...
                    'datatype', sizestr, ...
                    'size',app.size);
                propgrp = matlab.mixin.util.PropertyGroup(propList);
            end
        end
    end

end

【问题讨论】:

    标签: matlab class


    【解决方案1】:

    也许overloading the disp method 适合你的班级:

    function str=disp(obj)
        p=properties(obj);
        for i=1:length(p),
            propval=get(obj,p);
            if isscalar(propval) % custom special format. 
            % Translation of original: sizestr = ...
                    sprintf('%s (%d)', app.datatypenum2str(app.datatype), app.datatype);
                str{i}=sprintf('%s: %s (%d)',p{i}, datatypenum2str(propval), propval);
            else % standard display, mimicking getPropertyGroups@matlab.mixin.CustomDisplay
                str{i}=sprintf('%s: %s',p{i},disp(propval));
            end
        end
        str=sprintf('%s\n',str{:});
    
    end
    

    通过这种方式,您可以自定义属性在 root/ 中的显示方式,而无需使用 matlab.mixin.util.PropertyGroup 包装器。

    【讨论】:

    • 您的代码是解决此问题的另一种方法,我确实考虑过重载disp。我希望我可以让 MATLAB 自行格式化输出并整理出要显示的内容并避免其余部分。您的代码似乎重新格式化了它迭代的对象中的每个属性。我认为这很容易解决,只需要一个额外的if 块,不是吗?
    • 我已尝试将您想要的 if 块添加到我的提案中;-) 查看 if isscalar
    • 谢谢。我不确定我是否遵循,以防万一我写这个!如果我错了,我很抱歉。我的意思是将我的自定义格式仅应用于其中一个属性。我不知道我错过了什么,但我认为您当前状态下的函数会遍历所有属性并将相同的格式模式应用于每个标量,而不是仅应用于一个选定属性的格式模式。无论如何感谢您的帮助。这是一个好的开始。
    • 我添加了一些 cmets。 HTH
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-08-12
    • 2016-02-26
    • 1970-01-01
    • 1970-01-01
    • 2011-07-08
    • 1970-01-01
    • 2017-05-04
    相关资源
    最近更新 更多