我已经定义了一个类似
的类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
函数。
请参阅文档中的(不那么简单的阅读)对应页面。