2014-11-26 2 views
7

Я хочу добавить данные в массив структур без полей добавленных структур, которые обязательно должны иметь тот же порядок как поля исходных структур. Например:Есть ли вариант структур Matlab, который не обеспечивает порядок полей?

% Works fine: 
students.name = 'John'; 
students.age = 28; 
student2.name = 'Steve'; 
student2.age = 23; 

students(2) = student2; 

% Error if the order of the fields of student2 is reversed 
students.name = 'John'; 
students.age = 28; 
student2.age = 23; 
student2.name = 'Steve'; 


students(2) = student2; % Error: Dissimilar structs 

Есть вариант структуры я могу добавить данные без необходимости держать тот же порядок полей?

РЕДАКТИРОВАТЬ: Один способ обхода заключается в том, чтобы всегда использовать поля «orderfields» matlabs, которые упорядочивают поля по алфавиту. То есть приведенный выше ошибочный пример станет следующим:

% Order fields alphabetically 
students.name = 'John'; 
students.age = 28; 
student2.age = 23; 
student2.name = 'Steve'; 
students = orderfields(students); 
student2 = orderfields(student2); 
students(2) = student2; % Works 

Я не уверен, является ли это наиболее естественным решением.

+4

вероятно применение 'orderfields' для обеих структур исправляет это. – Daniel

+0

Спасибо, я видел ваш комментарий слишком поздно! – jolo

ответ

4

«естественное» решение было бы initiallize (создание) каждая структура с фиксированным порядком поля. После того, как структура была создана таким образом, вы можете заполнить свои поля в любом порядке.

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

create_student = @(x) struct('name',[], 'age',[]); %// empty fields. Fixed order 

Так что ваш код станет

students = create_student(); %// call struct creator 
students.name = 'John'; 
students.age = 28; 
student2 = create_student(); %// call struct creator 
student2.age = 23; 
student2.name = 'Steve'; 
students(2) = student2; %// Now this works 
2

Да, есть альтернатива, использующая классы. См., Например, документацию classdef, или, в общем, start page of Matlab's OOP. Обратите внимание, что перед тем, как использовать их, вам требуется написать некоторые файлы классов, поэтому это не так просто, как использование структур, но это будет более гибким после выполнения задания класса def.

+0

Спасибо - хорошая идея, но я думаю, что это не очень практично в моем случае! – jolo

1

Простой способ применить orderfields, прежде чем назначить любую-структуру, так как Даниэль предлагает в комментариях

>> students(1) = orderfields(struct('name', 'John', 'age', 18)); 
>> students(2) = orderfields(struct('age', 20, 'name', 'Jane')); 
Смежные вопросы