Also comparison is quite large. no of rows are 1508 in 'array' and nearly 900 in 'x'

# How to compare rows of an array with other rows?

21 views (last 30 days)

Show older comments

Hey.. How to compare rows of an array with rows defined in x?

array={[1,2,3,4,6,13,18,9];[13];[12,1,2,5];[3,4];[1,5,6]}

x=[1;3]

comparison will be based on x. e.g. first element in x is 1 so it will compare 1st row of array with all other rows. 2nd element is 3 so 3rd row will be compared will all other rows. Comparison will get intersection of elements like:

result{1,1}= {[13;[1,2];[3,4];[1,6]]}

result{2,1}= {[[1,2];0;0;[1,6];[1,5]]}

0 means no common element was found.

please help.

##### 4 Comments

Jan
on 19 Jan 2018

Edited: Jan
on 19 Jan 2018

The question is not clear. The elements of the cell array called "array" have one row only. Do you mean, that their first columns are compared? Or do you mean the 1st and 3rd element of the cell array?

Note that there is a missing ] in

result{1,1}= {[13;[1,2];[3,4];[1,6]]}

and this is not valid also:

result{2,1}= {[[1,2];0;0;[1,6];[1,5]]}

because you cannot concatenate vectors of different width vertically.

### Accepted Answer

Jan
on 19 Jan 2018

Edited: Jan
on 19 Jan 2018

The question is not clear, but I guess a code which produces the output:

array = {[1,2,3,4,6,13,18,9];[13];[12,1,2,5];[3,4];[1,5,6]}

x = [1;3];

Result = cell(1, numel(x));

n = numel(array);

for ix = 1:numel(x)

index = x(ix);

A = array{index};

B = cell(1, n - 1);

iB = 0;

for ia = 1:n

if ia ~= index

iB = iB + 1;

Inter = intersect(A, array{ia});

if isempty(Inter)

Inter = 0;

end

B{iB} = Inter;

end

end

Result{ix} = B;

end

It might help to save time, if you sort the arrays at first:

for k = 1:numel(array)

array{k} = sort(array{k});

end

##### 4 Comments

### More Answers (1)

Birdman
on 19 Jan 2018

Edited: Birdman
on 19 Jan 2018

Another approach for your problem, which is shorter:

for i=1:numel(x)

temp=setdiff(1:size(array,1),x(i));

for j=1:numel(temp)

result{j,i}=intersect(array{x(i),1},array{temp(j),1});

end

end

##### 2 Comments

Jan
on 19 Jan 2018

Edited: Jan
on 19 Jan 2018

Yes, it is shorter. But it omits the pre-allocation of result and using 0 as output, if no intersections are found. It is slower, because array{x(i),1} is addressed in each iteration.

Another idea, which avoids setdiff, which is an overkill for a scalar input:

n = size(array, 1);

v = 1:n;

result = cell(n-1, numel(x));

result(:) = {0};

for i = 1:numel(x)

temp = v(v ~= i); % Short form of: setdiff(v, i)

ai = array{x(i)}; % Or maybe: ai = unique(array{x(i)})

for j = 1:n-1

r = intersect(ai, array{temp(j)});

if ~isempty(r)

result{j,i} = r;

end

end

end

This might be an efficient mix of our solutions.

### See Also

### Categories

### Community Treasure Hunt

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

Start Hunting!