如何显示对象数组?

时间:2019-03-07 09:15:05

标签: matlab

我定义了

之类的类
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=%d\n', 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。)

2 个答案:

答案 0 :(得分:1)

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

如果您在控制台中尝试out.a,则会得到:

>> out.a
ans =
     1
ans =
     3

这是用逗号分隔的a数组中所有out值的列表。这也是自定义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=%d\n', [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=%d\n', this.a , this.b );
        else
           for k=1:nElem
                fprintf('a=%d b=%d\n', this(k).a , this(k).b);
            end
        end
    end

这将产生与以前相同的显示,但是由于元素被一个接一个地对待,因此您可以进一步自定义,而不必考虑fprintf处理数组的方式。

答案 1 :(得分:0)

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

请参阅文档中的corresponding page(不是那么简单)。