我定义了
之类的类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
。)
答案 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(不是那么简单)。