从技术上讲,MATLAB 中的Astruct
并不是您所说的“对象”。如果我创建一个结构,然后将其分配为另一个结构中的一个字段,那么两者现在是分离的。对第一个结构所做的任何更改都不会反映在我们刚刚制作的副本中。
a = struct('a', 2);
b = struct('b', a);
a.a = 3
% b.b.a == 2
您实际上只能可靠地检查两个s 的值struct
是否相等。
如果您确实想验证struct
您要比较的两个 s 是否以相同的方式创建,您可以递归地struct
检查并确定两个结构中每个元素的内存位置是否相同。这意味着结构是相等的,并且它们是使用相同的基础数据创建的。
对于一个非常简单的非深度嵌套结构,这可能看起来像这样。
function bool = isSameStruct(A, B)
fmt = get(0, 'Format');
format debug;
memoryLocation = @(x)regexp(evalc('disp(x)'), '(?<=pr\s*=\s*)[a-z0-9]*', 'match');
if isequaln(A, B)
bool = true;
elseif ~isequal(sort(fieldnames(A)), sort(fieldnames(B)))
bool = false;
else
fields = fieldnames(A);
bool = true;
for k = 1:numel(fields)
if ~isequal(memoryLocation(A.(fields{k})), memoryLocation(B.(fields{k})))
bool = false;
break;
end
end
end
format(fmt);
end
更新
另一种方法是为节点使用实际handle
对象。一个基本的类看起来像这样。
classdef Node < handle
properties
Value
Children
end
methods
function self = Node(value)
self.Value = value;
end
function addChild(self, node)
self.Children = cat(2, self.Children, node)
end
end
end