How randomly choose pairs of elements from a squared matrix and put them in an other matrix?

Hi, I have a matrix A
A =
1 4 2 3
4 3 1 2
3 2 4 1
2 1 3 4
How to make different groups of two elements from this matrix? But the chosen elements (from the matrix A) have to be adjacent in the matrix A. for example A(1,1) & A(1,2) are adjacent and so they can be chosen. and A(1,1) & A(4,3) can't be chosen to make a group. I'd like to create a function which randomly choose these elements from A. And the function generates an other matrix containing the (2 by 2) different groupements randomly created.
example "function group":
V=group(A)
V= 1 4
3 2
4 2
3 1
2 1
4 3
3 2
1 4
This new V matrix is made of groups
A(1,1)&A(2,1)
A(2,2)&A(4,1)
A(1,2)&A(1,3)
...
Hope you understand what I mean. In fact we randomly choose pairs of elements in the matrix A. thank you!

 Accepted Answer

m=5
n=numel(A)
ii=0
while ii<m
id=randperm(16);
[ii1,jj1]=ind2sub(size(A),id(1));
[ii2,jj2]=ind2sub(size(A),id(2));
if and(abs(ii1-ii2)<=1,abs(jj1-jj2)<=1);
ii=ii+1;
B(ii,:)=[A(id(1)) A(id(2))]
end
end

3 Comments

Thank you this i great. But how can I know who are the chosen groups from the matrix A? I'd like if it is possible, to know their initial position from A.
m=5
n=numel(A)
ii=0
while ii<m
id=randperm(16);
[ii1,jj1]=ind2sub(size(A),id(1));
[ii2,jj2]=ind2sub(size(A),id(2));
if and(abs(ii1-ii2)<=1,abs(jj1-jj2)<=1);
ii=ii+1;
B(ii,:)=[A(id(1)) A(id(2))]
indice1{ii,1}=[ii1 jj1]
indice2{ii,1}=[ii2 jj2]
end
end
[cell2mat(indice1) cell2mat(indice2)]
THANK YOu very much. But I am sorry, there is just one problem I just forgot to mentionate. The chosen elements must be adjacent but not "diagonnaly adjacent", and they must be chosen just ONE TIME (the chosen elements can't be REchoose). So, at the end, I have to get only 8 pairs.

Sign in to comment.

More Answers (1)

m=5
n=numel(A)
ii=0
idx=[];
while ii<m
id=setdiff(randperm(16),idx,'stable');
[ii1,jj1]=ind2sub(size(A),id(1));
[ii2,jj2]=ind2sub(size(A),id(2));
if or(abs(ii1-ii2)==1 & abs(jj1-jj2)==0,abs(ii1-ii2)==0 & abs(jj1-jj2)==1);
ii=ii+1;
idx=[idx id(1:2)];
B(ii,:)=[A(id(1)) A(id(2))]
end
end
disp(idx) % Linear index
[idx1,idx2]=ind2sub(size(A),idx);

4 Comments

GREAT. Thank you very much. And for the indices? Should I use the same codes than hereover?
idx1(1) idx2(1) coordinate of first point,
idx1(2) idx2(2) coordinate of adjacent second point
and so on
Ok Thanks. If I put m=8, matlab run into a very long loop (Busy), is that normal? In fact, there is one only point that the script can't associate with an adjacent point, because these other points are already chosen. It is not a big problem but that's a pitty. I'll try to correct it. please give me idea if you have. Thank you very much
That means it can not find 8 couples of adjacent elements

Sign in to comment.

Categories

Community Treasure Hunt

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

Start Hunting!