我正在扩展现有的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它应该在连接时自动创建缺少的字段?还是有另一种方式以优雅的方式解决这个问题吗?
(当然,我可以编辑所有现有的子程序,以确保它们处理的所有点都获得新字段(设置为''),如果它们还没有它。但我希望尽可能少地改变现有代码相反,确保所有进入点(作为参数传递给现有例程)都是“新风格”也很困难。)
答案 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如功能描述中所述。
明智地选择:)