空Matlab结构和所有元素之间的差异(:)
我的问题是: 如果空Matlab结构和所有元素之间的差异(:),matlab,matlab-struct,Matlab,Matlab Struct,我的问题是: 如果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 = struct('a',
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 = 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上测试):
[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
和S(:)
之间的区别一般适用于结构,而不仅仅适用于空结构
这种情况的一个原因是,这允许您选择是要访问结构还是其内容
一个实际的例子是分配[]
以删除某些内容:
S = struct();
T = struct();
S(:) = []; % An empty struct with all fields that S used to have
T = []; % Simply an empty matrix
S
现在是一个空结构,但仍然包含它以前拥有的所有字段
另一方面,T
现在只是变成了空矩阵[]
这两个操作都会实现您所期望的功能,如果不区分结构及其所有元素,这是不可能的 不错!此外,我确认R2012b和R2012aI上的seg故障刚刚在Matlab2014B上尝试过,但仍然崩溃。有趣。在2015b和2016b上不再崩溃。在检查这是如何概括的时候,我遇到了以下情况:
S = struct();
T = struct();
S(:) = []; % An empty struct with all fields that S used to have
T = []; % Simply an empty matrix