# Splitting Matrix based on another matrix

2 views (last 30 days)
Rounak Saha Niloy on 19 Oct 2022
Answered: Rounak Saha Niloy on 20 Oct 2022
I have two matrices as follows.
popx=[52.647 10.912 2.389
52.564 10.911 2.389
52.569 10.912 2.389
52.569 10.912 2.389
52.569 10.913 2.389
52.569 10.913 2.389];
cx=[52.646 10.912 2.389
52.564 10.911 2.389
52.569 10.913 2.403
52.570 10.912 2.389
52.569 10.913 2.389
52.569 10.912 2.389];
Now, I want to split cx into two matrirces as per the following-
1. rows which are UNIQUE with respect to popx.
2. rows wich are NOT UNIQUE with respect to cx.
Finally, I will again merge these two matrices which will be equivalent to cx (i do not mind if the order of rows are diffferent).
How can I do this?
Rounak Saha Niloy on 19 Oct 2022
It means that, the rows which are in cx but not in popx.

Rounak Saha Niloy on 20 Oct 2022
I would like to thank Matt J for helping me solve the problem. My sincere gratitude to him.
Meanwhile, this is the way how I have solved the issue-
archive = unique(popx,"rows","stable");
ia=find(~ismember(cx,popx,'rows')==1);
A = cx(ia,:); % A is the matrix of rows which are present in cx but not present in popx
ia1=setdiff(1:size(cx,1),ia);
B0=cx(ia1,:);
if size(B0,2)~=0
[~,ib]=ismember(B0,archive,"rows");
end
B=archive(ib,:);
C = [A;B];

Matt J on 19 Oct 2022
Edited: Matt J on 19 Oct 2022
This might be what you want.
popx=[52.647 10.912 2.389
52.564 10.911 2.389
52.569 10.912 2.389
52.569 10.912 2.389
52.569 10.913 2.389
52.569 10.913 2.389];
cx=[52.646 10.912 2.389
52.564 10.911 2.389
52.569 10.913 2.403
52.570 10.912 2.389
52.569 10.913 2.389
52.569 10.912 2.389];
[~,~,Gp]=unique(popx,'rows');
[~,~,Gc]=unique(cx,'rows');
Hp=histcounts(Gp,1:max(Gp)+1);
Hc=histcounts(Gc,1:max(Gc)+1);
crit1=(Hp==1);
crit2=(Hc>1);
M1=cx(crit1(Gp),:)
M1 = 2×3
52.6460 10.9120 2.3890 52.5640 10.9110 2.3890
M2=cx(crit2(Gc),:)
M2 = 0×3 empty double matrix
result=[M1,M2]
result = 2×3
52.6460 10.9120 2.3890 52.5640 10.9110 2.3890
Rounak Saha Niloy on 19 Oct 2022
Nah! I am sorry, this is not what I want.

Rounak Saha Niloy on 19 Oct 2022
This can be a way, I think. Need to think about the extreme cases though.
[A,ia]=setdiff(cx,popx,"rows","stable");
ia1=setdiff(1:size(cx,1),ia);
ic=find((ismember(popx,cx,"rows"))~=0);
if size(ia1,2)==size(unique(popx(ic,:),"rows"),1)
[~,~,ib]=intersect(cx,popx,'rows','stable');
else
ib=find((ismember(popx,cx,"rows"))~=0);
end
B=popx(ib,:);
C=[A;B];

Matt J on 19 Oct 2022
Edited: Matt J on 19 Oct 2022
popx=[52.647 10.912 2.389
52.564 10.911 2.389
52.569 10.912 2.389
52.569 10.912 2.389
52.569 10.913 2.389
52.569 10.913 2.389];
cx=[52.646 10.912 2.389
52.564 10.911 2.389
52.569 10.913 2.403
52.570 10.912 2.389
52.569 10.913 2.389
52.569 10.912 2.389];
[A,ia]=setdiff(cx,popx,'rows')
B=setdiff(cx,A,'rows')
C=[A;B]
Rounak Saha Niloy on 19 Oct 2022
[~,id]=ismember(B,archive,"rows")

### Categories

Find more on Logical in Help Center and File Exchange

R2022b

### Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!