#matlab
#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=%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
.)
Комментарии:
1. Итак, какой результат вы ожидаете? С моей точки зрения, все, кажется, выводится правильно — или лучше: как закодировано.
2. По моему мнению, результатом будет a = 1 b = 2 n a = 3 b = 4 таким же образом, как вызов
disp
функции для элементов массива по одному.3. Ах, я не видел «переключения» 2 и 3, извините. Спасибо, что указали на это.
Ответ №1:
Вы получаете этот результат, потому что в вашем заявлении out = [Test(1,2),Test(3,4)]
переменная out
становится массивом того же класса Test
, но размером [1×2].
Если вы попытаетесь 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=%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
.
Ответ №2:
При используемом вами синтаксисе вы должны перегружать display
функцию вместо disp
function.
Смотрите (не такую простую для чтения) соответствующую страницу в документации.