3

我正在使用附加功能扩展现有的 Matlab 程序。原程序用一个结构体来表示相空间中的一个稳态点,这个结构体有4个字段,像这样:

oldstylepoint =
    kind: 'stst'
    parameter: [0.7846 1]
    x: -2.0010
    stability: [1x1 struct]

在我的扩展中,我希望结构有 5 个字段(即一个额外的字段)。对于大多数点,该字段只是空的,但对于一些特殊(分叉)点,它将包含一些文本(命名发生的分叉类型)。所以它看起来像

newstylepoint =
    kind: 'stst'
    parameter: [0.7846 1]
    x: -2.0010
    stability: [1x1 struct]
    flag: 'hopf'

但是现在我们遇到了一个问题。像这样的点存储在数组(分支)中,并且大多数分支都是迭代构建的。所以现有的程序有几个子程序来做类似的事情

newbranch = [oldbranch, newpoint]
newbranch(1) = pointzero
newbranch(N+1) = newpoint

现在,如果分支包含“旧样式”点(有 4 个字段)并且我想添加一个“新样式”点(有 5 个字段),Matlab 会给出连接错误。

所以现在我的问题是:有什么方法可以告诉 Matlab 在连接时它应该自动创建缺失的字段?还是有另一种方法可以优雅地解决这个问题?

(当然,我可以编辑所有现有的子例程,以确保它们处理的所有点都获得新字段(设置为''),如果他们还没有的话。但我希望尽可能少地更改现有代码。另一个无论如何,确保所有输入点(作为参数传递给现有例程)都是“新风格”也很困难。)

4

2 回答 2

0

不幸的是,我不知道优雅的方式。

但是,是的,您可以完全按照帖子中的描述进行操作。

  • 检查它是否存在isfield
  • 如果需要,添加字段(使用setfield或短.符号)
于 2013-10-02T14:09:12.073 回答
0

如发现here,如果没有适度的解决方法,就不可能做到这一点。

我能想到的最简单和最安全的方法是在旧式点中初始化新字段,因此-arraystructs中的所有内容struct都具有相同的fieldnames,如下所示:

% Old-style points with only 4 fields
oldstylepoint = struct(...
    'kind', 'stst',...
    'parameter', [0.7846 1],...
    'x', -2.0010,...
    'stability', struct(...
        'test', 2)...
   );

% New-style points with 5 fields
newstylepoint = struct(...
    'kind', 'stst',...
    'parameter', [0.7846 1],...
    'x', -2.0010,...
    'stability', struct(...
    'test', 2),...
    'flag', 'hopf'...
);


% Example old-style branch
branch = [oldstylepoint; oldstylepoint]

% Before concatenation, initialize the new field in the branch
if ~isfield(branch, 'flag')
    [branch.flag] = deal([]); end

% Now we can concatenate without problems
[branch; newstylepoint]

您也可以选择为此使用工具(例如catstruct来自文件交换)。

这会将上面的 3 行示例更改为代码中的 1 行和更强大的解决方案,但会创建对 138 行代码的依赖项,但有其自身的限制(例如,MATLAB R13 及更高版本,如功能描述中所述)。

做出明智的选择 :)

于 2013-10-02T14:14:17.050 回答