필터 지우기
필터 지우기

While Loop Keep running non stop !!

조회 수: 1 (최근 30일)
hossam eldakroury
hossam eldakroury 2019년 2월 22일
댓글: hossam eldakroury 2019년 2월 22일
i have a matrix A
A=[ 1 1 2
3 3 4
4 4 5
5 5 6
6 6 7
7 7 8
8 8 9
9 9 10
10 10 11
12 12 13
13 13 14
15 15 16
16 16 17
17 17 18
18 2 19
19 19 20
20 20 21
21 21 22
22 3 23
23 23 24
24 24 25
26 26 27
27 27 28
28 28 29
28 29 30
30 30 31
31 31 32
33 21 8
34 9 15
35 22 12
36 18 33
37 25 29]
i want to make a loop which detect repeated values of column no. 3 then swap the repeated value of column 3 with column 2 from bottom to up and keep swapping going up until no repeated values in column 3
i made somthing like that
[c,ia,ib] = unique(A(:,3));
FF=length(ia)-1;
Ncount = histc(A(:,3), c);
for i=FF:-1:1
Ncount = histc(A(:,3), c);
while Ncount(i)==2
A(i,[2,3])=A(i,[3,2]);
Ncount = histc(A(:,3), c);
end
end
but the loop keep running and i think that because of two Ncount=2 at row 28 (29 is repeated in row 37 and 28) and Ncount=2 at row 7 (8 is repeated at row 7 and 33) !!
please help !
  댓글 수: 4
Bob Thompson
Bob Thompson 2019년 2월 22일
Your loop doesn't exit because you never meet the break conditions. When I ran it I got that Ncount was a 1x10 array that never changed, while the loop was looking for element 26 of N to be equal to 2.
hossam eldakroury
hossam eldakroury 2019년 2월 22일
yes thats the problem and i cant fix it.. i dont even know if using while loop is a correct choice !!

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

채택된 답변

Bob Thompson
Bob Thompson 2019년 2월 22일
편집: Bob Thompson 2019년 2월 22일
Ok, I think I got something working. The while loop was a fine choice, it was more a matter of indexing and changing things together. Also, it was impossible to start changing values from the back, because you ran into an infinite loop.
[c,ia,ib] = unique(A(:,3));
Ncount = histc(A(:,3), c);
if sum(Ncount >= 2) >0;
c2 = c(Ncount >= 2);
while sum(Ncount >= 2) > 0
A(find(ismember(A(:,3),c2),max(Ncount),'first'),[3,2]) = A(find(ismember(A(:,3),c2),max(Ncount),'first'),[2,3]);
[c,ia,ib] = unique(A(:,3));
Ncount = histc(A(:,3), c);
c2 = c(Ncount >= 2);
end
end
  댓글 수: 3
Bob Thompson
Bob Thompson 2019년 2월 22일
편집: Bob Thompson 2019년 2월 22일
[c,ia,ib] = unique(A(:,3));
Ncount = histc(A(:,3), c);
if sum(Ncount >= 2) >0;
c2 = c(Ncount >= 2);
while sum(Ncount >= 2) > 0
for i = 1:size(A,1);
if ~ismember(A(i,2),c)
A(i,[3,2]) = A(i,[2,3]);
end
[c,ia,ib] = unique(A(:,3));
end
Ncount = histc(A(:,3), c);
c2 = c(Ncount >= 2);
end
end
I think this one is a bit more robust. Let me know.
EDIT**
For the record, the while loop should now be obsolete. When I ran it the loop only occured once.
hossam eldakroury
hossam eldakroury 2019년 2월 22일
Man your the best .. it worked, thank you so mcuh.

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

추가 답변 (0개)

카테고리

Help CenterFile Exchange에서 Logical에 대해 자세히 알아보기

Community Treasure Hunt

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

Start Hunting!

Translated by