Kisheon
Kisheon

Reputation: 43

MATLAB - Frequency of an array element with a condition

I need some help please. I have an array, as shown below, 6 rows and 5 columns, none of the elements in any one row repeats. The elements are all single digit numbers. I want to find out, per row, when a number, let's say 1 appears, I want to keep of how often the other numbers of the row appear. For example, 1 shows up 3 times in rows one, three and five. When 1 shows up, 2 shows up one time, 3 shows up two times, 4 shows up two times, 5 shows up one time, 6 shows up two times, 7 shows up one time, 8 shows up three times, and 9 shows up zero times. I want to keep a vector of this information that will look like, V = [3,1,2,2,1,2,1,3,0], by starting with a vector like N = [1,2,3,4,5,6,7,8,9]

ARRAY =
    1     5     8    2    6
    2     3     4    6    7 
    3     1     8    7    4
    6     5     7    9    4
    1     4     3    8    6
    5     7     8    9    6

The code I have below does not give the feedback I am looking for, can someone help please? Thanks

for i=1:length(ARRAY)
    for j=1:length(N)
        ARRAY(i,:)==j
        V(j) = sum(j)         
    end 
end 

Upvotes: 0

Views: 95

Answers (2)

rahnema1
rahnema1

Reputation: 15837

Using indices that is in A creae a zero and one 6 * 9 matrix that [i,j] th element of it is 1 if i th row of A contains j.

Then multiply the zero and one matrix with its transpose to get desirable result:

A =[...
    1     5     8    2    6
    2     3     4    6    7 
    3     1     8    7    4
    6     5     7    9    4
    1     4     3    8    6
    5     7     8    9    6]
% create a matrix with the size of A  that each row contains the row number
rowidx = repmat((1 : size(A,1)).' , 1 , size(A , 2))
% z_o a zero and one  6 * 9 matrix that  [i,j] th element of it is 1 if i th row of A contains j
z_o = full(sparse(rowidx , A, 1))
% matrix multiplication with its transpose to create desirable result. each column relates to number N
out = z_o.' * z_o

Result: each column relates to N

   3   1   2   2   1   2   1   3   0
   1   2   1   1   1   2   1   1   0
   2   1   3   3   0   2   2   2   0
   2   1   3   4   1   3   3   2   1
   1   1   0   1   3   3   2   2   2
   2   2   2   3   3   5   3   3   2
   1   1   2   3   2   3   4   2   2
   3   1   2   2   2   3   2   4   1
   0   0   0   1   2   2   2   1   2

Upvotes: 1

Some Guy
Some Guy

Reputation: 1797

I don't understand how you are approaching the problem with your sample code but here is something that should work. This uses find, any and accumarray and in each iteration for the loop it will return a V corresponding to the ith element in N

for i=1:length(N)
    rowIdx = find(any(A == N(i),2)); % Find all the rows contain N(j)
    A_red = A(rowIdx,:); % Get only those rows
    V = [accumarray(A_red(:),1)]'; % Count occurrences of the 9 numbers
    V(end+1:9) = 0; % If some numbers don't exist place zeros on their counts
end

Upvotes: 0

Related Questions