Как отобразить массив объектов как will?

#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.

Смотрите (не такую простую для чтения) соответствующую страницу в документации.