我知道可以通过以下几种方式定义结构:
向变量添加字段
p.color.red = .2;
p.color.green = .4;
p.color.blue = .7;
通过赋值定义标量结构
S = struct('a', 0, 'b', 1, 'c', 2);
我想要做的是创建一个结构定义(如C)。我的最终目标是拥有一系列可以迭代并执行测试的结构。有什么办法可以定义一个通用结构然后创建它的实例吗?我应该使用其他一些机制吗?我知道MATLAB支持Java,我应该使用类/接口吗?
答案 0 :(得分:32)
您提到您的目标是使用相同类型的多个结构,因此您应该了解可用的两种主要方法以及它们的比较方式:
您可以通过动态增长数组来初始化它
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};
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
另一方面,由于结构的每个字段都存储为自己的数组,因此您需要强制执行必须匹配的事实。
如果您想了解更多相关内容,可以发布其他一些帖子:
答案 1 :(得分:6)
与C不同,Matlab允许您在结构中添加或删除结构中的成员。具有某些字段的结构可以与某些函数一起使用,这更符合惯例。
所以,是的,这是创建结构的两种基本方法。当然,您始终可以在* .m文件中编写函数,该文件会为您创建包含某些字段的结构。或者,如果您想获得更多OO,请参阅here