我的问题是:是什么区别S
和S(:)
,如果S
是一个空的结构。
我认为,就是因为这个问题上的区别: 添加一个字段设置为空结构
最小的说明性示例:
S = struct(); %Create a struct
S(1) = []; %Make it empty
[S(:).a] = deal(0); %Works
[S.b] = deal(0); %Gives an error
错误给出:
一个点的名字结构分配是非法的,当结构为空。 在结构上使用标。
我的问题是:是什么区别S
和S(:)
,如果S
是一个空的结构。
我认为,就是因为这个问题上的区别: 添加一个字段设置为空结构
最小的说明性示例:
S = struct(); %Create a struct
S(1) = []; %Make it empty
[S(:).a] = deal(0); %Works
[S.b] = deal(0); %Gives an error
错误给出:
一个点的名字结构分配是非法的,当结构为空。 在结构上使用标。
[S(:).b] = deal(0)
是相当于[S(1:end).b] = deal(0)
它将扩展为[S(1:numel(S)).b] = deal(0)
或者,在特定情况下[S(1:0).b] = deal(0)
因此,你要处理的无结构的元素,这是我所期待的工作,但我还是觉得有些奇怪,这将增加一个字段b
。 也许正是这种特殊的怪事,你只能通过显式指定字段列表访问,由错误捕获。
需要注意的是,如果你想创建一个领域的空白结构b
,则可以选择写
S(1:0) = struct('b',pi) %# pie or no pie won't change anything
虽然这给出了一个为0x0结构。
事实上,这里是另一个奇怪的一个给你:
>> S = struct('a',{}, 'b',{})
S =
0x0 struct array with fields:
a
b
>> [S(:).c] = deal()
S =
0x0 struct array with fields:
a
b
c
>> S().d = {} %# this could be anything really, [], 0, {}, ..
S =
0x0 struct array with fields:
a
b
c
d
>> S = subsasgn(S, substruct('()',{}, '.','e'), {})
S =
0x0 struct array with fields:
a
b
c
d
e
>> S = setfield(S, {}, 'f', {1}, 0)
S =
0x0 struct array with fields:
a
b
c
d
e
f
现在最有趣的部分,我发现了一种崩溃MATLAB(上R2013a测试):
%# careful MATLAB will crash and your session will be lost!
S = struct();
S = setfield(S, {}, 'g', {}, 0)
实际上的区别S
和S(:)
适用于结构一般,不仅空结构。
原因之一,这可能是这种情况,是因为这可以让你选择是否要访问的结构或内容。
一个实际的例子是的分配[]
以消除东西:
S = struct();
T = struct();
S(:) = []; % An empty struct with all fields that S used to have
T = []; % Simply an empty matrix
S
现在是一个空的结构,但仍包含它之前,必须各个领域。
T
在另一方面,现已简直成了空矩阵[]
这两项行动做你所期望的,而这将不无结构和它的所有元素之间的区别是可能的。