我的问题是:
如果S
是一个空结构,S(:)
和S
之间有什么区别。
我认为因为这个问题存在差异: Adding a field to an empty struct
最小的说明性示例:
S = struct(); %Create a struct
S(1) = []; %Make it empty
[S(:).a] = deal(0); %Works
[S.b] = deal(0); %Gives an error
给出的错误:
当结构为空时,点名结构分配是非法的。使用下标 结构
答案 0 :(得分:7)
事实上,这是另一个奇怪的问题:
>> 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)
答案 1 :(得分:4)
[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结构。
答案 2 :(得分: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
现在只是变成空矩阵[]
。
这两个动作都按照您的期望行事,如果没有结构及其所有元素之间的区别,这是不可能的。