Как отобразить массив объектов как будет? - PullRequest
0 голосов
/ 07 марта 2019

Я определил класс как

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

Ответы [ 2 ]

1 голос
/ 07 марта 2019

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

0 голосов
/ 07 марта 2019

С использованием синтаксиса, который вы используете, вы должны перегрузить функцию display вместо функции disp.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...