Collapsing integer data into consecutive integers?

I have a matrix of values that include integers >= 0. There are repeats, and also gaps in consecutiveness. I would like to collapse the data into consecutive integers, keeping the order intact.
Example: [ 0 1 4 4 1 5 8 1 4]
would go to
[ 0 1 2 2 1 3 4 1 2]
I can do this with loops and brute force, but I'm wondering if there's any quick way to do this since it is frequently called within a loop?
Thanks!

3 件のコメント

John
John 2013 年 6 月 18 日
I don't understand what you're aiming for... the example result you show isn't consecutive (1 to 3? 4 to 1?), and you're entirely changing some of the numbers.
John
John 2013 年 6 月 18 日
It looks like you just divided everything by 2, rounding up.
Mark
Mark 2013 年 6 月 18 日
Not consecutive in the array, but consecutive in the counting of unique numbers in the original. I.e., there are 5 unique numbers in the original vector, 0 1 4 5 and 8. I wanted to map those to 0 1 2 3 4. (The divide by two and round was just coincidence!) The problem has been solved below. Thanks.

サインインしてコメントする。

 採用された回答

Tom
Tom 2013 年 6 月 18 日

2 投票

[~,~,I] = unique([ 0 1 4 4 1 5 8 1 4]);
disp(I-1)

その他の回答 (1 件)

Iain
Iain 2013 年 6 月 18 日

1 投票

Ex = [ 0 1 4 4 1 5 8 1 4]; % A row
V = unique(Ex); % should be a row
L = bsxfun(@eq,Ex,V);
Collapsed = [0:(numel(V)-1)]*L;
Reconstructed = V' * L;

カテゴリ

タグ

質問済み:

2013 年 6 月 18 日

Community Treasure Hunt

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

Start Hunting!

Translated by