Removing unique numbers whilst comparing two structures
    5 views (last 30 days)
  
       Show older comments
    
I have two structs, one called AllPositions_CA with X and Y fields containing this type of layout: 
X                              Y
1x17051 double	1x17051 double
1x17267 double	1x17267 double
1x17579 double	1x17579 double
1x17971 double	1x17971 double
1x17959 double	1x17959 double
1x17947 double	1x17947 double
1x17854 double	1x17854 double
1x641 double	        1x641 double
1x17918 double	1x17918 double
1x17544 double	1x17544 double
This structure has a length 114 (I have only shown 10)
I have a second structure called PositionA which has X and Y fields containing this type of layout:
X                      Y
1x42 double	1x42 double
1x44 double	1x44 double
1x43 double	1x43 double
1x43 double	1x43 double
1x44 double	1x44 double
1x43 double	1x43 double
1x43 double	1x43 double
1x43 double	1x43 double
1x44 double	1x44 double
1x42 double	1x42 double
This particular structure has length of 18000 (I have only shown 10)
I want to be able to take ALL X and Y values as pairs in AllPositions_CA and compare them to X and Y pair values in PositionA and remove any values which are present in PositionA but are not present in AllPositions_CA and put them into a new structure whilst retaining the layout of the structure PositionA. For example after the removal of some values from PositionA the new structure will look like:
X                      Y
1x40 double	1x40 double
1x39 double	1x39 double
1x41 double	1x41 double
1x40 double	1x40 double
1x42 double	1x42 double
1x41 double	1x41 double
1x39 double	1x39 double
1x40 double	1x40 double
1x43 double	1x43 double
1x38 double	1x38 double
I have looked into intersect and setdiff but cannot get my head around how to loop one structure through another to find differences and return the desired final layout as above.
Thanks
3 Comments
  Image Analyst
      
      
 on 25 Apr 2019
				Please attach AllPositions_CA in a .mat file with the paper clip icon.  
Also, see Stephen's answer below.
Accepted Answer
  Stephen23
      
      
 on 25 Apr 2019
        
      Edited: Stephen23
      
      
 on 25 Apr 2019
  
      A loop and ismember makes this clear and easy. An alternative would be to merge the X and Y data, and then call setdiff in the loop with its 'rows' option.
I assume that you wanted to match both the X and Y values simultaneously, i.e. you want to match coordinate pairs, not individual values. (you did not specify this explicitly in your question).
Here is a simple working example with a loop:
C = struct('X',{[0,1,3],[3,4]}, 'Y',{[5,6,8],[8,9]});
A = struct('X',{[0,2,3],[3,10]},'Y',{[5,7,8],[8,11]});
Z = struct('X',{},'Y',{}); % new structure.
CX = [C.X]; % All of C.X.
CY = [C.Y]; % All of C.Y.
for k = 1:numel(C)
	idx = ismember(A(k).X,CX) & ismember(A(k).Y,CY);
	Z(k).X = A(k).X(~idx); % copy non matching to Z.
	Z(k).Y = A(k).Y(~idx); % copy non matching to Z.
	A(k).X(~idx) = []; % optional: remove from A.
	A(k).Y(~idx) = []; % optional: remove from A.
end
Giving (for example):
>> A.X
ans =
     0     3
ans =
     3
>> Z.X
ans =
     2
ans =
    10
3 Comments
More Answers (0)
See Also
Categories
				Find more on Data Type Identification in Help Center and File Exchange
			
	Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!


