是否有一种Matlab结构体的变量类型,它不会强制要求字段的顺序?

7

我想向一个结构体数组中添加数据,但所添加的结构体字段的顺序不一定与原始结构体的字段相同。

例如:

% 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

我不确定这是否是最自然的解决方案。


4
orderfields应用于这两个结构体可能会解决这个问题。 - Daniel
谢谢,我看到你的评论太晚了! - jolo
3个回答

4
一个“自然”的解决方案是使用固定的字段顺序初始化(创建)每个结构体。一旦以这种方式创建了结构体,就可以按任何顺序填充其字段。
此外,您可以将创建封装在一个函数中。这简化了代码并确保顺序一致。在您的情况下,创建函数可以是:
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文档,或更一般地参阅Matlab面向对象编程的起始页。请注意,在使用之前需要编写一些类文件,因此它不像使用结构体那样直截了当,但是一旦完成类定义工作,它就更加灵活。

谢谢 - 很好的想法,但我认为在我的情况下不太实际! - jolo

1

一种简单的方法是在分配任何结构之前应用orderfields,就像Daniel在评论中建议的那样。

>> students(1) = orderfields(struct('name', 'John', 'age', 18));
>> students(2) = orderfields(struct('age', 20, 'name', 'Jane'));

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接