MATLAB: Removing unique numbers whilst comparing two structures

intersectismemberMATLABsetdiffstructures

I have two structs, one called AllPositions_CA with X and Y fields containing this type of layout:
X Y
1×17051 double 1×17051 double
1×17267 double 1×17267 double
1×17579 double 1×17579 double
1×17971 double 1×17971 double
1×17959 double 1×17959 double
1×17947 double 1×17947 double
1×17854 double 1×17854 double
1×641 double 1×641 double
1×17918 double 1×17918 double
1×17544 double 1×17544 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
1×42 double 1×42 double
1×44 double 1×44 double
1×43 double 1×43 double
1×43 double 1×43 double
1×44 double 1×44 double
1×43 double 1×43 double
1×43 double 1×43 double
1×43 double 1×43 double
1×44 double 1×44 double
1×42 double 1×42 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
1×40 double 1×40 double
1×39 double 1×39 double
1×41 double 1×41 double
1×40 double 1×40 double
1×42 double 1×42 double
1×41 double 1×41 double
1×39 double 1×39 double
1×40 double 1×40 double
1×43 double 1×43 double
1×38 double 1×38 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

Best Answer

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