rbmatlab  1.16.09
 All Classes Namespaces Files Functions Variables Modules Pages
isequal_ignore_handles_nan_treatment.m
1 function res = isequal_ignore_handles(s1,s2)
2 %function res = isequal_ignore_handles(s1,s2)
3 %
4 % generalization of isequal for structures with possibly
5 % function_handles. as isequal does not work for these,
6 % function_handles are skipped
7 %
8 % parameters:
9 % s1: general variable to be compared
10 % s2: general variable to be compared
11 %
12 % return value:
13 % boolean, indicating wether the two variables are identical (while ignoring
14 % function handles)
15 
16 res = 0;
17 
18 if ~isequal(class(s1),class(s2))
19  return;
20 end;
21 
22 switch class(s1)
23  case 'function_handle'
24  res = 1;
25  return
26  case {'double'};
27  % isequal does not work for nan entries!!!
28  %res = isequal(s1,s2);
29  i1 = find(~isnan(s1));
30  i2 = find(~isnan(s2));
31  res = (isequal(size(s1),size(s2))) && ...
32  (isequal(i1,i2)) && isequal(s1(i1),s2(i1));
33  case {'char','single','logical','rectgrid','triagrid','onedgrid'}
34  res = isequal(s1,s2);
35  case 'cell'
36  if length(s1)~=length(s2)
37  return;
38  else
39  res = 1;
40  for i=1:length(s1)
41  res = res && isequal_ignore_handles(s1{i},s2{i});
42  end;
43  end;
44  case 'struct'
45  fn1 = fieldnames(s1);
46  fn2 = fieldnames(s2);
47  if length(intersect(fn1,fn2))~=length(fn1)
48  res = 0;
49  return;
50  end;
51  res = 1;
52  for i = 1:length(fn1)
53  res = res && ...
54  isequal_ignore_handles(s1.(fn1{i}),s2.(fn1{i}));
55  end;
56  otherwise
57  error('class type not yet supported');
58 end;
59