如何按照将显示一系列对象



我已经定义了一个类似

的类
classdef Test
properties
    a 
    b
end
methods
    function this = Test(a, b)
        this.a = a;
        this.b = b;
    end
    function disp(this)
        fprintf('a=%d b=%dn', this.a, this.b);
    end
end

end

但是,当我想显示Test的向量时,似乎并未使用刚刚定义的disp函数打印每个数组的元素。

>> out = [Test(1,2),Test(3,4)]
  out = 
    a=1 b=3
    a=2 b=4

问题是如何适当显示对象数组?有没有办法超载disp功能并按照以下方式打印:

out=
   a=1 b=2
   a=3 b=4

(在我的考虑中,输出将与将disp函数调用到一个数组的元素。但是,输出似乎首先打印所有A的值1 3,然后打印B的值2 4。)

您正在获得此结果,因为在您的语句out = [Test(1,2),Test(3,4)]中,变量out成为同一类Test的数组,但大小[1x2]。

如果您在控制台中尝试out.a,您将获得:

>> out.a
ans =
     1
ans =
     3

这是out数组中a的所有值的昏迷列表。这也是您自定义disp函数看到的第一个参数。然后,它看到了b所有值的另一列向量。要了解函数fprintf与您一起显示的功能也可以在您的控制台中尝试:

>> [out.a,out.b]
ans =
     1     3     2     4
>> [out.a;out.b]
ans =
     1     3
     2     4

由于fprintf按照列的主要顺序工作,因此它将首先消耗所有值列。在这种情况下,我们可以看到我们尝试的最后一个选项似乎更好。

的确,如果您将disp功能更改为:

function disp(this)
    fprintf('a=%d b=%dn', [this.a ; this.b]);
end

您获得所需的输出:

>> out = [Test(1,2),Test(3,4),Test(5,6)]
out = 
a=1 b=2
a=3 b=4
a=5 b=6

您定义的对象数组的大小。请记住,如果您输入Test对象的数组,它们将被视为列的明智:

>> out = [ Test(1,2),Test(3,4) ; Test(5,6),Test(7,8) ]
out = 
a=1 b=2
a=5 b=6
a=3 b=4
a=7 b=8

最后一个选项,如果您希望在对象数组的显示上更加粒度,则可以按照disp函数内的方式自定义它:

    function disp(this)
        nElem = numel(this) ;
        if nElem==1
            fprintf('a=%d b=%dn', this.a , this.b );
        else
           for k=1:nElem
                fprintf('a=%d b=%dn', this(k).a , this(k).b);
            end
        end
    end

这会产生与以前相同的显示,但是由于元素是一个一个元素的处理,因此您可以进一步自定义,而无需考虑fprintf的数组的处理方式。

使用您使用的语法,应超载display函数而不是disp函数。

请参阅文档中的(不那么简单的阅读)对应页面。

最新更新