То, что я хочу сделать, - это создать определение структуры (например, C). Моя конечная цель состоит в том, чтобы иметь массив структур, в которые я могу выполнить итерацию и выполнить тестирование. Есть ли способ определить общую структуру, а затем создать ее экземпляры? Должен ли я использовать какой-то другой механизм. Я знаю, что MATLAB поддерживает Java, должен ли я использовать класс/интерфейс?
Ответ 2
Вы упомянули, что ваша цель состояла в том, чтобы работать с несколькими структурами того же типа, поэтому вы должны знать о доступных двух основных подходах и о том, как они сравниваются:
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
С другой стороны, поскольку каждое из полей структуры хранится в виде собственного массива, вам нужно обеспечить соблюдение того факта, что они должны совпадать по длине.
Некоторые другие сообщения, если вы хотите узнать больше об этом: