how to write such a loop?

조회 수: 2 (최근 30일)
Shuoguo
Shuoguo 2011년 4월 12일
hello,
if i have a n*1 vector. every element can interact with each other.an 1 at position (i,j) means member i will change its state with member j.an zero means they do not change together. so all the interactions between any two elements can be expressed in a n*n matrix (diagnal is 0 means i^th element do not interact with itself):
0 1 0 1 0 0 0 0
1 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
1 0 0 0 1 0 0 0
0 0 0 1 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
now my question is: i want to begin with a random place, and find all that co-change with it (all the friends), then go on and find all that co-change with its friends (new friends), and go on until no new friends can be find.
eg.
1. i begin with element 1.
2. i go to first row, find element 2 and 4 are friends
3. then i go to row2 find 1 (not new friends); go to row 4 find 1 (again) and 5 (new friends);
4. then continue to row 5, find 4 (not new friends) 5. mark 1,2,4,5 as friends. 6. go back to step 1, find a new element (other than 1,2,4,5) to start with.
i have some bigger matrix to work with (100*100)...and this has been puzzled me for a while, please help me out.
thanks a lot.
Shuoguo
  댓글 수: 4
Shuoguo
Shuoguo 2011년 4월 12일
oh i skipped something...lets say the so called vector is, for this case, 8 random numbers like V=[1 2 3 4 8 7 6 5].each element of V, Vi has a spin variable either 0 or 1 (only two "states", 0 or 1 for simplicity. It can be 10 states numbered from 1~10).
the interaction between any two elements forms a 8*8 matrix P, if Vi and Vj have the same spin, then P_ij=1, else 0. so by looking at P, an 1 simply means there is an interaction between two elements and 0 means no interaction.
if Vi interacts with Vj, and Vj interacts with Vk, then Vi interacts with Vk, and so on.
so my question is if i begin with any Vi, i want to find all that can interact with it directly (like Vi-Vj) or indirectly (Vi-Vk).
thanks
Shuoguo
Shuoguo 2011년 4월 12일
by the way the so called "spin" variable will be a separate vector that defines some property of Vi...i gave random numbers to vector V since the actual value is not critical when we are talking about spin interactions.

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

답변 (3개)

the cyclist
the cyclist 2011년 4월 12일
Here is a solid kick in the right direction. The while-loop only tests if you have found all possible friends (based on the size of the original array). It does not test whether you have reached a "steady-state" because the network does not extend to all possible people. Should be easy to add that, if you want.
A = [0 1 0 1 0 0 0 0
1 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
1 0 0 0 1 0 0 0
0 0 0 1 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0];
N = size(A,1); % Assume symmetric, square array A
allFriends = 1:N;
oldFriends = 1
pause(1)
while not(numel(oldFriends)==numel(allFriends))
for nf = oldFriends
newFriends = find(A(nf,:));
oldFriends = union(oldFriends,newFriends); % Automatically sorted by MATLAB, which is important for while test.
end
oldFriends
pause(1)
end
  댓글 수: 1
Shuoguo
Shuoguo 2011년 4월 12일
when i run this i think matlab stuck somewhere?

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


Shuoguo
Shuoguo 2011년 4월 12일
thanks the cyclist...i also just worked out a code (bigger than yours)and so far i am not eyeballing any bugs.
P =
0 1 0 1 0 0 0 0
1 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
1 0 0 0 1 0 0 0
0 0 0 1 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
while ~isempty(P>0)
[rs,~]=find(P>0);
if isempty(rs)
return;
else
rs=rs(1);
end
func = @(x) find(P(x,:)>0);
c = rs;
oldc = c;
while true
c=oldc;
[r c] = func(c);
c=sort(unique(c))';
if isequal(c,oldc)
break;
end
oldc=[oldc c];
oldc=sort(unique(oldc));
end
P(c,:)=0;
end
  댓글 수: 2
Matt Fig
Matt Fig 2011년 4월 12일
With that P, your code simply returns....
Shuoguo
Shuoguo 2011년 4월 12일
get a wrong matrix...fixed

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


Walter Roberson
Walter Roberson 2011년 4월 12일
I didn't catch the bit about the spin variable, but the other part sound like standard matrix traversal that is implemented by taking successive matrix powers.

카테고리

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

태그

Community Treasure Hunt

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

Start Hunting!

Translated by