Вы получаете этот результат, потому что в вашем выражении 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
.