pic
pic

Reputation: 5

count co-occurrence neighbors in a vector

I have a vector : for example S=(0,3,2,0,1,2,0,1,1,2,3,3,0,1,2,3,0). I want to count co-occurrence neighbors, for example the first neighbor "o,3" how many times did it happen till the end of the sequence? Then it investigates the next pair"2,0" and similarly do it for other pairs. Below is a part of my code:

s=size(pic);
S=s(1)*s(2);
V = reshape(pic,1,S);
min= min(V);
Z=zeros(1,S+1);
Z(1)=min;
Z(2:end)=V;
for i=[0:2:length(Z)-1];
contj=0
    for j=0;length(Z)-1;

        if  Z(i,i+1)= Z(j,j+1) 
            contj=contj+1

        end 

    end
    count(i)= contj
end

It gives me this error:

The expression to the left of the equals sign is not a valid target for an assignment

in this line:

if  Z(i,i+1)= Z(j,j+1) 

I read similar questions and apply the tips on it but they didn't work!

Upvotes: 0

Views: 93

Answers (2)

Luis Mendo
Luis Mendo

Reputation: 112769

If pairs are defined without overlapping (according to comments):

S = [0,3,2,0,1,2,0,1,1,2,3,3,0,1,2,3]; %// define data
S2 = reshape(S,2,[]).'; %'// arrange in pairs: one pair in each row
[~, jj, kk] = unique(S2,'rows'); %// get unique labels for pairs
pairs = S2(jj,:); %// unique pairs
counts = accumarray(kk, 1); %// count of each pair. Or use histc(kk, 1:max(kk))

Example: with S as above (I introduce blanks to make pairs stand out),

S = [0,3, 2,0, 1,2, 0,1, 1,2, 3,3, 0,1, 2,3];

the result is

pairs =
     0     1
     0     3
     1     2
     2     0
     2     3
     3     3

counts =
     2
     1
     2
     1
     1
     1

If pairs are defined without overlapping but counted with overlapping:

S = [0,3,2,0,1,2,0,1,1,2,3,3,0,1,2,3]; %// define data
S2 = reshape(S,2,[]).'; %'// arrange in pairs: one pair in each row
[~, jj] = unique(S2,'rows'); %// get unique labels for pairs
pairs = S2(jj,:); %// unique pairs
P = [S(1:end-1).' S(2:end).']; %// all pairs, with overlapping
counts = sum(pdist2(P,pairs,'hamming')==0);

If you don't have pdist2 (Statistics Toolbox), replace last line by

counts = sum(all(bsxfun(@eq, pairs.', permute(P, [2 3 1]))), 3);

Result:

>> pairs
pairs =
     0     1
     0     3
     1     2
     2     0
     2     3
     3     3
>> counts
counts =
     3     1     3     2     2     1

Upvotes: 2

Shai
Shai

Reputation: 114976

do it using sparse command

os = - min(S) + 1; % convert S into indices 
% if you want all pairs, i.e., for S = (2,0,1) count (2,0) AND (0,1):
S = sparse( S(1:end-1) + os, S(2:end) + os, 1 );
% if you don't want all pairs, i.e., for S = (2,0,1,3) count (2,0) and (1,3) ONLY:
S = sparse( S(1:2:end)+os, S(2:2:end) + os, 1 );
[f s c] = find(S);
f = f - os; % convert back
s = s - os;

co-occurences and their count are in the pairs (f,s) - c

>> [f s c]
ans =

 2     0     2  % i.e. the pair (2,0) appears twice in S...
 3     0     2
 0     1     3
 1     1     1
 1     2     3
 3     2     1
 0     3     1
 2     3     2
 3     3     1  

Upvotes: 0

Related Questions