我想将数据添加到结构数组中,而添加的结构的字段必须与原始结构的字段具有相同的顺序。 例如:
% 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
是否有结构的变体我可以添加数据而不必保持相同的字段顺序?
编辑:一种解决方法是始终使用matlabs“orderfields”,它按字母顺序排序字段。也就是说,上述错误的例子将成为:
% 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
我不确定这是否是最自然的解决方案。
答案 0 :(得分:4)
A"自然"解决方案是初始化(创建)具有固定字段顺序的每个结构。以这种方式创建结构后,您可以按任何顺序填充其字段。
此外,您可以将创建封装在函数中。这简化了代码并确保顺序一致。在您的情况下,创建者功能可能是
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
答案 1 :(得分:2)
是的,有一种替代方法,就是使用类。例如,请参阅classdef
的文档,或者更常见的是start page of Matlab's OOP。请注意,它需要您在使用之前编写一些类文件,因此它不像使用结构那样简单,但是一旦完成类定义作业,它就会更灵活。
答案 2 :(得分:1)
一种简单的方法是在分配任何结构之前应用orderfields
,正如Daniel在评论中所建议的那样
>> students(1) = orderfields(struct('name', 'John', 'age', 18));
>> students(2) = orderfields(struct('age', 20, 'name', 'Jane'));