Zied
Zied

Reputation: 25

How to select values with the higher occurences from several matrices having the same size in matlab?

I would like to have a program that makes the following actions:

Upvotes: 1

Views: 157

Answers (2)

angainor
angainor

Reputation: 11810

Here is the code you need. I have introduced a number of constants:

nmatrices - number of matrices
n, m      - dimensions of a single matrix
maxval    - maximum value of an entry (99)

I first generate example matrices with rand. Matrices are changed to vectors and concatenated in the CC matrix. Hence, the dimensions of CC are [m*n, nmatrices]. Every row of CC holds individual (i,j) values for all matrices - those you want to analyze.

CC = [];
% concatenate all matrices into CC
for i=1:nmatrices
    % generate some example matrices
    % A = round(rand(m, n)*maxval);
    A = eval(['neurone' num2str(i)]);
    % flatten matrix to a vector, concatenate vectors
    CC = [CC A(:)];
end

Now we do the real work. I have to transpose CC, because matlab works on column-based matrices, so I want to analyze individual columns of CC, not rows. Next, using histc I find the most frequently occuring values in every column of CC, i.e. in (i,j) entries of all matrices. histc counts the values that fall into given bins (in your case - 1:maxval) in every column of CC.

% CC is of dimension [nmatrices, m*n]
% transpose it for better histc and sort performance
CC = CC';
% count values from 1 to maxval in every column of CC
counts = histc(CC, 1:maxval);

counts have dimensions [maxval, m*n] - for every (i,j) of your original matrices you know the number of times a given value from 1:maxval is represented. The last thing to do now is to sort the counts and find out, which is the most frequently occuring one. I do not need the sorted counts, I need the permutation that will tell me, which entry from counts has the highest value. That is exactly what you want to find out.

% sort the counts. Last row of the permutation will tell us, 
% which entry is most frequently found in columns of CC
[~,perm] = sort(counts);

% the result is a reshaped last row of the permutation
B = reshape(perm(end,:)', m, n);

B is what you want.

Upvotes: 0

cjh
cjh

Reputation: 866

Building on @angainor 's answer, I think there is a simpler method using the mode function.

nmatrices - number of matrices
n, m      - dimensions of a single matrix
maxval    - maximum value of an entry (99) 

First organize data into a 3-D matrix with dimensions [n X m X nmatrices]. As an example, we can just generate the following random data in a 3-D form:

CC = round(rand(n, m, nmatrices)*maxval); 

and then the computation of the most frequent values is one line:

B = mode(CC,3);   %compute the mode along the 3rd dimension

Upvotes: 3

Related Questions