Как определить структуру в Matlab - PullRequest
19 голосов
/ 12 ноября 2010

Я знаю, что структура может быть определена несколькими способами, такими как:

  1. Добавление полей в переменную

    p.color.red = .2;
    p.color.green = .4;
    p.color.blue = .7;
    
  2. Определение скалярной структуры с помощью присваивания

    S = struct('a',  0, 'b',  1, 'c',  2);
    

Я хочу иметь возможность создать определение структуры (например, C).Моей конечной целью является создание массива структур, через которые я могу проходить и выполнять тестирование.Есть ли способ, которым я могу определить общую структуру, а затем создать ее экземпляры?Должен ли я использовать какой-то другой механизм.Я знаю, что MATLAB поддерживает Java. Должен ли я использовать класс / интерфейс?

Ответы [ 2 ]

32 голосов
/ 13 ноября 2010

Вы упомянули, что ваша цель состояла в том, чтобы работать с несколькими структурами одного типа, поэтому вы должны знать о двух основных доступных вам подходах и о том, как они сравниваются:

1) массив структур

Вы можете инициализировать его, динамически увеличивая массив

p(1).str = 'white';
p(1).r = 1;
p(1).g = 1;
p(1).b = 1;
p(2).str = 'black';
p(2).r = 0;
p(2).g = 0;
p(2).b = 0;

Однако всегда лучше начать с предварительного выделения массива

p = repmat( struct('r',[], 'g',[], 'b',[], 'str',[]), 1, 10);

еще один прием для предварительного выделения:

p(10) = struct('r',[], 'g',[], 'b',[], 'str',[]);

Или даже дать все значения при инициализации:

p = struct('r',{1 0}, 'g',{1 0}, 'b',{1 0}, 'str',{'white' 'black'});

Простой способ заполнения значений

names = {'white' 'black'};
[p(1:2).str] = names{:};
red = num2cell([1 0]);
[p(1:2).r] = red{:};

Вот как вы получаете все значения одного поля:

red = [p(:).r];
names = {p(:).str};

2) структуры массивов

p.r = [1 0];
p.g = [1 0];
p.b = [1 0];
p.str = {'white' 'black'};

p1 = [p.r(1) p.g(1) p.b(1)];

Преимущество этого состоит в том, что структура представляет собой просто массив указателей (r, g, b, str хранятся отдельно в памяти).Сравните это с предыдущим подходом, где у нас есть массив структур, и у каждой структуры есть указатели на свое поле (там довольно много памяти):

>> s1 = repmat( struct('r',0, 'g',0, 'b',0), 1, 1000);
>> s2 = struct('r',zeros(1,1000), 'g',zeros(1,1000), 'b',zeros(1,1000));
>> whos
  Name      Size               Bytes  Class     Attributes

  s1        1x1000            204192  struct              
  s2        1x1                24372  struct              

С другой стороны, так как каждое из полейструктуры хранится в виде собственного массива, вам нужно обеспечить факт, что они должны совпадать по длине.

Некоторые другие сообщения, если вы хотите узнать больше об этом:

6 голосов
/ 12 ноября 2010

В отличие от C, Matlab позволяет добавлять или удалять элементы из структуры по мере необходимости.Это скорее соглашение о том, что структура с определенными полями может использоваться с определенными функциями.

Так что да, это два основных способа создания структур.Конечно, вы всегда можете написать функцию в файле * .m, которая создает структуру с определенными полями для вас.Или, если вы хотите получить больше ОО, см. здесь

...