Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
空Matlab结构和所有元素之间的差异(:)_Matlab_Matlab Struct - Fatal编程技术网

空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