# find the next row of an element in a matrix

조회 수: 13 (최근 30일)
Elysi Cochin . 2020년 3월 25일
댓글: Elysi Cochin . 2020년 3월 25일
i have vector v
v = [4,5;1,2;1,3;1,4;2,6;5,7;4,7;3,4;1,5;2,3;7,9;3,5;8,9;1,6;8 10;5,9;2,4;6,9;2,5;1,7;4,9;3,7;2,8;7,8;4,6;1,9;3,9;5,6;2,7;6,7;1,8;3,8;4,8;5,8;2,9];
from this vector v, find the next row of an element in a matrix till all the elements in the matrix has taken once
i need to take start with the first row [ 4 5 ],
then take the second value in the started row (only when we start the iteration i = 1 case, we take the second value), and find, next in which row value 5 comes
It can come in any column first or second
if in the row, we take, if the other value has already been taken, we dont consider row eg:
[ 4 5; 5 7; then comes 4 7] but as 4 is already taken i dont take [4 7] i go to next [ 7 9 ] and get
[ 4 5; 5 7; 7 9....]
continue this till size(v,1)
out = [4 5; 5 7; 7 9; 8 9; 8 10];
un_out = unique(out,'stable');
un_out = [4 5 7 9 8 10]
then check
uv = unique(v);
uv = [ 1 2 3 4 5 6 7 8 9 10]
if i have got all the elements of uv in un_out, i can exit, else, i need to take the second row of v [ 1 2 ]
then continue as above,
taking the second value in the started row (as we start the iteration i = 1 case again), and find, next in which row value 2 comes
it can come in any column first or second
continue this till size(v,1)
so new out will be
un_out = { [4 5 7 9 8 10] [ 1 2 6 ] }
again only 3 is missing.
so add that to out, to get
un_out = { [4 5 7 9 8 10] [ 1 2 6 ] [ 3 ]} % final output
can someone help me to write the loop to find the next row of an element in a matrix till all the elements in the matrix has taken once
##### 댓글 수: 2표시 이전 댓글 수: 1숨기기 이전 댓글 수: 1
Elysi Cochin 2020년 3월 25일
Sir Guillaume, its Clarke and Wright algorithm. I solved the initial steps in it. But when i reached this portion to find the path, i got stuck. I searched for different solutions, but could find one.
Do you have any suggestions? If so that would be of great help

댓글을 달려면 로그인하십시오.

### 채택된 답변

Rik 2020년 3월 25일
This probably isn't the fastest solution, but it does get the output you describe. The last loop I had to guess, so let me know if you meant something else.
v = [4,5;1,2;1,3;1,4;2,6;5,7;4,7;3,4;1,5;2,3;7,9;3,5;8,9;1,6;8 10;5,9;2,4;6,9;2,5;1,7;4,9;3,7;2,8;7,8;4,6;1,9;3,9;5,6;2,7;6,7;1,8;3,8;4,8;5,8;2,9];
outcell=cell(1);outcell_counter=0;
start_row=0;
while true
start_row=start_row+1;
out=[];
val=v(start_row,2);
r=start_row;
while true
out=[out;v(r,:)]; %#ok<AGROW>
skiprows=r;
[r,c]=find(v((skiprows+1):end,:)==val);
r=r+skiprows;%correct the row indices
c=(c-0.5)*-1+2.5;%flip 1 to 2 and 2 to 1
foundnewvalue=false;
for k=1:numel(r)%will be skipped if r is empty
if ~any(out(:)==v(r(k),c(k)))
foundnewvalue=true;
r=r(k);
val=v(r,c(k));
break%continue to next row
end
end
if ~foundnewvalue || r==(size(v,1)-1)
break%end of list is reached
end
end
out = unique(out,'stable')';%flip to row
outcell_counter=outcell_counter+1;
outcell{1,outcell_counter}=out;
if isempty(setdiff(unique(v(:)),cell2mat(outcell)))
break
end
end
for n=2:numel(outcell)
outcell{n}=setdiff(outcell{n},cell2mat(outcell(1:(n-1))));
end
clc,celldisp(outcell)

댓글을 달려면 로그인하십시오.

### 카테고리

Help CenterFile Exchange에서 Loops and Conditional Statements에 대해 자세히 알아보기

### Community Treasure Hunt

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

Start Hunting!