空Matlab结构S与所有元素S(:)之间的区别

时间:2013-05-02 16:04:07

标签: matlab matlab-struct

我的问题是: 如果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

给出的错误:

当结构为空时,点名结构分配是非法的。使用下标 结构

3 个答案:

答案 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)

实际上SS(:)之间的差异一般适用于结构,不仅适用于空结构。

可能出现这种情况的一个原因是,因为这允许您选择是否要访问结构或其内容。

一个实际的例子就是分配[]以删除某些内容:

S = struct();
T = struct();

S(:) = []; % An empty struct with all fields that S used to have
T = []; % Simply an empty matrix

S现在是一个空结构,但仍然包含它以前的所有字段。

另一方面,

T现在只是变成空矩阵[]

这两个动作都按照您的期望行事,如果没有结构及其所有元素之间的区别,这是不可能的。