为什么在分配结构之前不需要定义结构字段?

时间:2016-05-19 01:59:30

标签: matlab syntax matlab-struct

我正在使用MATLAB中的其他人的代码,看起来他正在创建结构,只是使用字段名称而不是完全声明它们。它是如何在MATLAB中工作的,您只是开始使用您选择的不区分大小写的字段名称吗?

所以,例如,他有这样的事情:

classdef Emitter
   properties
      transients=[];
   end
end

... some other class
   methods
      function sound=makeSound()
         emitterthing.transients.receivedIntensity = 100
         emitterthing.transients.frequency = 500
      end
   end 

换句话说,他只是开始编写字段名称并为其分配值而不声明字段名称或类型。

它在MATLAB中是如何工作的吗?

2 个答案:

答案 0 :(得分:3)

是,字段名称are dynamic in MATLAB and can be added or removed at any time

%// Construct struct with two fields
S = struct('one', {1}, 'two', {2});

%// Dynamically add field
S.three = 3;

%// Remove a field
S = rmfield(S, 'two')

唯一的限制是,如果你有一个结构的数组,它们都必须有相同的字段名。

%// Create an array of structures
S(1).one = '1.1';
s(2).one = '1.2';

%// Dynamically add a new field to only one of the structs in the array
s(1).two = '2.1';

%// s(2) automatically gets a "two" field initialized to an empty value
disp(s(2))

%//     one: '1.2'
%//     two: []

此外,MATLAB使用动态类型,因此无需提前定义任何变量的类型或struct的字段。

答案 1 :(得分:0)

您需要区分structs,这只是存储数据的便捷方式(suever's answer涵盖的功能)和instances of classes。结构也是类的实例,但所有属性都是 动态属性 的设计,您无需担心它。情况并非总是如此。

例如,如果你在图中用很多gui元素从头开始创建一个gui,你需要在gui元素之间传递很多属性和值。在所有元素的共同点是它们被放置的图形。它的句柄,当前图形的句柄,图形类的实例,可以通过gcf在gui的每个回调函数中轻松获得。因此,使用此句柄传递gui中的所有信息会很方便。

但你不能这样做:

h = figure(1);
h.myData = 42;

因为图表类不提供dynamic property myData - 您需要define it

h = figure(1);
addprop(h,'myData');
h.myData = 42;

我希望现在差异很明显。