Getting rows that correspond to second occurrence of a value

I have a matrix x:
x = [1 11;
1 12;
1 13;
2 26;
2 27;
2 28;
3 34;
4 41;
4 42]
x is guaranteed to be sorted by the first column and then the second column.
From the second column, I want the second occurrence (if any) for each unique value in the first column. So, in my example, I want my output to be
y = [12; 27; 42];
My first thought was to do this with accumarray:
y = accumarray(x(:,1),x(:,2),[],@(x)x(2));
but this errors because there is no second row when x(:,1)==3.
Thoughts? I don't need this to be fast, or handle huge arrays; I'd like it to be elegant!

답변 (4개)

Jos (10584)
Jos (10584) 2013년 7월 16일
x(strfind([1 diff(x(:,1)).']==0,[0 1])+1,2)

댓글 수: 2

Jos (10584)
Jos (10584) 2013년 7월 16일
편집: Jos (10584) 2013년 7월 16일
oh, and add a transpose at the end ;-)
Jan
Jan 2013년 7월 16일
편집: Jan 2013년 7월 16일
If you speak Matlab fluently, this looks elegant. For a beginner, this looks crude. +1

댓글을 달려면 로그인하십시오.

Jan
Jan 2013년 7월 16일
[dummy, n, index] = RunLength(x(:, 1));
y = x(index(n >= 2) + 1, 2);
Cedric
Cedric 2013년 7월 16일
편집: Cedric 2013년 7월 16일
Here is another one liner:
>> regexp('','(?@ buffer=urlread(''http://en.wikipedia.org/wiki/Sea_urchin''); eval(''x(strfind([1 diff(x(:,1)).'''']==0,[0 1])+1,str2num(buffer(regexp(buffer, ''''\(?<=size from 6 to 1\)\\d'''', ''''start''''))))''))') ;
Isn't that elegant? ;-)
C.

댓글 수: 1

If you speak Matlab fluently, this looks crude. For a beginner, this looks crude. +1

댓글을 달려면 로그인하십시오.

Andrei Bobrov
Andrei Bobrov 2013년 7월 31일
편집: Andrei Bobrov 2013년 8월 1일
[a,b] = unique(x(:,1),'first');
out = x(b(histc(x(:,1),a)>=2)+1,2);
or
[~,i1] = unique(x(:,1),'first');
[~,i2] = unique(x(:,1),'last');
out= x(i1((i2 - i1) > 0) + 1,2);

카테고리

도움말 센터File Exchange에서 Structures에 대해 자세히 알아보기

제품

질문:

2013년 7월 16일

Community Treasure Hunt

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

Start Hunting!

Translated by