更改Matlab结构时的向后兼容性

时间:2013-10-02 13:38:14

标签: matlab

我正在扩展现有的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它应该在连接时自动创建缺少的字段?还是有另一种方式以优雅的方式解决这个问题吗?

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

2 个答案:

答案 0 :(得分:0)

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

但是,你可以完全按照帖子中的说明进行操作。

  • 检查isfield
  • 是否存在
  • 根据需要添加字段(使用setfield或短.表示法)

答案 1 :(得分:0)

如找到here,如果没有适量的解决方法,就无法做到这一点。

我能想到的最简单和最安全的方法是初始化旧式点中的新字段,因此structs - 数组中的所有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如功能描述中所述。

明智地选择:)