How to find the length of intersection of rows of a matrix?

13 views (last 30 days)
I have a matrix
A = 1 1 1 0 0 0 0 0 0 0
0 0 0 0 1 1 1 0 0 0
0 0 1 1 1 0 1 1 1 0
0 1 1 1 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
1 1 1 0 1 1 1 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 1 1 1 1 1 1 0 0
0 0 1 1 1 0 1 1 1 0
0 0 0 0 1 1 1 1 1 1
I want to find out the intersection between the row of the matrix and the output should be the no. of overlapping for each ones and lenth of overlapping.
For example, for row 1 and 3 column 3 has one length overlapping, row 1 and 6 have 3 length of overlapping, row 3 and 4 have two length overlapping. I wnat to do the same for all rows of the matrix.
Is there any way how we can figure out this?

Accepted Answer

Voss
Voss on 19 Jul 2022
A = [ 1 1 1 0 0 0 0 0 0 0
0 0 0 0 1 1 1 0 0 0
0 0 1 1 1 0 1 1 1 0
0 1 1 1 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
1 1 1 0 1 1 1 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 1 1 1 1 1 1 0 0
0 0 1 1 1 0 1 1 1 0
0 0 0 0 1 1 1 1 1 1 ];
row_pairs = nchoosek(1:size(A,1),2);
disp(row_pairs)
1 2 1 3 1 4 1 5 1 6 1 7 1 8 1 9 1 10 2 3 2 4 2 5 2 6 2 7 2 8 2 9 2 10 3 4 3 5 3 6 3 7 3 8 3 9 3 10 4 5 4 6 4 7 4 8 4 9 4 10 5 6 5 7 5 8 5 9 5 10 6 7 6 8 6 9 6 10 7 8 7 9 7 10 8 9 8 10 9 10
n_pairs = size(row_pairs,1);
n_overlaps = zeros(n_pairs,1);
for ii = 1:n_pairs
n_overlaps(ii,1) = nnz(A(row_pairs(ii,1),:) & A(row_pairs(ii,2),:));
end
disp([row_pairs n_overlaps]);
1 2 0 1 3 1 1 4 2 1 5 0 1 6 3 1 7 0 1 8 1 1 9 1 1 10 0 2 3 2 2 4 0 2 5 0 2 6 3 2 7 0 2 8 3 2 9 2 2 10 3 3 4 2 3 5 0 3 6 3 3 7 0 3 8 5 3 9 6 3 10 4 4 5 0 4 6 2 4 7 0 4 8 2 4 9 2 4 10 0 5 6 0 5 7 0 5 8 0 5 9 0 5 10 0 6 7 0 6 8 4 6 9 3 6 10 3 7 8 0 7 9 0 7 10 0 8 9 5 8 10 4 9 10 4
  2 Comments
Voss
Voss on 20 Jul 2022
This will give you a vector of overlap/intersection lengths for each pair of rows of A:
A = [ 1 1 1 0 0 0 0 0 0 0
0 0 0 0 1 1 1 0 0 0
0 0 1 1 1 0 1 1 1 0
0 1 1 1 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
1 1 1 0 1 1 1 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 1 1 1 1 1 1 0 0
0 0 1 1 1 0 1 1 1 0
0 0 0 0 1 1 1 1 1 1 ];
n_rows = size(A,1);
row_pairs = nchoosek(1:n_rows,2);
n_pairs = size(row_pairs,1);
overlap_lengths = cell(n_pairs,1);
for ii = 1:n_pairs
overlap = A(row_pairs(ii,1),:) & A(row_pairs(ii,2),:);
start_idx = strfind([false overlap],[false true]);
end_idx = strfind([overlap false],[true false]);
overlap_lengths{ii} = end_idx-start_idx+1;
end
result = array2table(row_pairs,'VariableNames',{'Row 1','Row 2'});
result.overlap_lengths = overlap_lengths;
disp(result)
Row 1 Row 2 overlap_lengths _____ _____ _______________ 1 2 {0×0 double} 1 3 {[ 1]} 1 4 {[ 2]} 1 5 {0×0 double} 1 6 {[ 3]} 1 7 {0×0 double} 1 8 {[ 1]} 1 9 {[ 1]} 1 10 {0×0 double} 2 3 {[ 1 1]} 2 4 {0×0 double} 2 5 {0×0 double} 2 6 {[ 3]} 2 7 {0×0 double} 2 8 {[ 3]} 2 9 {[ 1 1]} 2 10 {[ 3]} 3 4 {[ 2]} 3 5 {0×0 double} 3 6 {[ 1 1 1]} 3 7 {0×0 double} 3 8 {[ 3 2]} 3 9 {[ 3 3]} 3 10 {[ 1 3]} 4 5 {0×0 double} 4 6 {[ 2]} 4 7 {0×0 double} 4 8 {[ 2]} 4 9 {[ 2]} 4 10 {0×0 double} 5 6 {0×0 double} 5 7 {0×0 double} 5 8 {0×0 double} 5 9 {0×0 double} 5 10 {0×0 double} 6 7 {0×0 double} 6 8 {[ 1 3]} 6 9 {[ 1 1 1]} 6 10 {[ 3]} 7 8 {0×0 double} 7 9 {0×0 double} 7 10 {0×0 double} 8 9 {[ 3 2]} 8 10 {[ 4]} 9 10 {[ 1 3]}
To find how many overlaps/intersections are of each possible length, over all pairs of rows:
all_overlap_lengths = [overlap_lengths{:}];
max_overlap = size(A,2);
n_overlaps = zeros(1,max_overlap);
for ii = 1:max_overlap
n_overlaps(ii) = nnz(all_overlap_lengths == ii);
end
disp(n_overlaps);
16 7 12 1 0 0 0 0 0 0

Sign in to comment.

More Answers (2)

Monica Roberts
Monica Roberts on 19 Jul 2022
You can use the "and" command to find which values of each vector both are "true" or equal to 1. If you sum up those values you will get the total number of "overlapping" as you say.
sum(and(A(1,:),A(6,:))) % How many 1's in both 1st and 6th row

vishweshwar samba
vishweshwar samba on 19 Jul 2022
Edited: vishweshwar samba on 19 Jul 2022
Created all posssible row combinations found the overlaping and placed them in the table to compare
A = [ 1 1 1 0 0 0 0 0 0 0;
0 0 0 0 1 1 1 0 0 0;
0 0 1 1 1 0 1 1 1 0;
0 1 1 1 0 0 0 0 0 0;
0 0 0 0 0 0 0 0 0 0;
1 1 1 0 1 1 1 0 0 0;
0 0 0 0 0 0 0 0 0 0;
0 0 1 1 1 1 1 1 0 0;
0 0 1 1 1 0 1 1 1 0;
0 0 0 0 1 1 1 1 1 1 ];
% Create all possible row combinations
a1 = 1:numel(A(1,:));
a2 = 1:numel(A(:,1));
a3 = combvec(a1,a2)';
% Assign columns of a3 to R1 and R2 to make the code readable
R1 = a3(:,1);
R2 = a3(:,2);
% finding the overlapps and counting them
z = sum(and(A(R1,:),A(R2,:)),2);
% Table the data
overlapping = table(R1,R2,z)
overlapping = 100×3 table
R1 R2 z __ __ _ 1 1 3 2 1 0 3 1 1 4 1 2 5 1 0 6 1 3 7 1 0 8 1 1 9 1 1 10 1 0 1 2 0 2 2 3 3 2 2 4 2 0 5 2 0 6 2 3
  3 Comments

Sign in to comment.

Community Treasure Hunt

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

Start Hunting!