空Matlab的结构S和所有元素S之间的差异(:)(Difference between empty

2019-09-01 18:27发布

我的问题是:是什么区别SS(:) ,如果S是一个空的结构。

我认为,就是因为这个问题上的区别: 添加一个字段设置为空结构

最小的说明性示例:

S = struct(); %Create a struct
S(1) = []; %Make it empty
[S(:).a] = deal(0); %Works
[S.b] = deal(0); %Gives an error

错误给出:

一个点的名字结构分配是非法的,当结构为空。 在结构上使用标。

Answer 1:

[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结构。



Answer 2:

事实上,这里是另一个奇怪的一个给你:

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


Answer 3:

实际上的区别SS(:)适用于结构一般,不仅空结构。

原因之一,这可能是这种情况,是因为这可以让你选择是否要访问的结构或内容。

一个实际的例子是的分配[]以消除东西:

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

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

S现在是一个空的结构,但仍包含它之前,必须各个领域。

T在另一方面,现已简直成了空矩阵[]

这两项行动做你所期望的,而这将不无结构和它的所有元素之间的区别是可能的。



文章来源: Difference between empty Matlab struct S and all elements S(:)