AdeB
AdeB

Reputation: 187

Sort a vector and count the identical occurrences

What is a Matlab-efficient way (no loop) to do the following operation: transform an input vector input into an output vector output such as output(i) is the number of integers in input that are less or equal than input(i).

For example:

input = [5 3 3 2 4 4 4]

would give:

output = [7 3 3 1 6 6 6]

Upvotes: 3

Views: 227

Answers (2)

Eitan T
Eitan T

Reputation: 32930

First of all, don't use input for a variable name, it's a reserved keyword. I'll use X here instead.

An alternative way to obtain your desired result would be:

[U, V] = meshgrid(1:numel(X), 1:numel(X));
Y = sum(X(U) >= X(V))

and here's a one-liner:

Y = sum(bsxfun(@ge, X, X'))

EDIT:
If X has multiple rows and you want to apply this operation on each row, this is a little bit trickier. Here's what you can do:

[U, V] = meshgrid(1:numel(X), 1:size(X, 2));
V = V + size(X, 2) * idivide(U - 1, size(X, 2));
Xt = X';
Y = reshape(sum(Xt(U) >= Xt(V))', size(Xt))'

Example:

X =  
   5   3   3   2   4   4   4
   3   9   7   7   1   2   2

Y = 
   7   3   3   1   6   6   6
   4   7   6   6   1   3   3

Upvotes: 1

AdeB
AdeB

Reputation: 187

I have found a possible answer:

output = arrayfun(@(x) sum(x>=input),input)

but it doesn't take advantage of vectorization.

Upvotes: 1

Related Questions