получить все первые вхождения столбца на основе значения другого столбца - matlab - PullRequest
0 голосов
/ 28 апреля 2018
m = repmat([0,0,0,0,0,0,1,1,1,1,1,1,2,2,2,2,2,2;11,11,22,22,33,33,11,11,22,22,33,33,11,11,22,22,33,33],1,2)'

Я пытаюсь получить все первые вхождения m(:,1) при m(:,2)==11
В моем примере я хотел бы получить вектор:

 0  (from row 1, because it's the first occurrence of (0,11))
 1  (from row 7, because it's the first occurrence of (1,11))
 2  (from row 13, because it's the first occurrence of (2,11))
 0  (from row 19, because it's the next first occurrence of (0,11))
 1  (from row 25, because it's the next first occurrence of (1,11))
 2  (from row 31, because it's the next first occurrence of (2,11))

Я думал, что unique может быть функцией для этого, но unique(m(:,1),'rows') игнорирует повторяющиеся значения

ans =

     0
     1
     2

Ответы [ 2 ]

0 голосов
/ 28 апреля 2018

Вот еще один способ:

indx_11 = find(m(:,2) == 11);
% Find all the places where change occurs which will miss the 1st element
indxDiff = (diff(m(:,1))~=0); 
% Include the 1st element
m(intersect(find([1; indxDiff]), indx_11),1); 

Работает и для следующего вектора.

m1 = [0,1,0,0,0,0,1,1,1,1,1,1,2,2,2,2,2,2,0,0,0,0,0,0,1,1,1,1,1,1,2,2,2,2,2,2; ...
11,11,22,22,33,33,11,11,22,22,33,33,11,11,22,22,33,33,11,11,22,22,33,33,11,11,22,22,33,33,11,11,22,22,33,33]';
0 голосов
/ 28 апреля 2018

Вот способ получить его без цикла for:

a = find(m(:, 2) == 11); % index for all 11
repeat = [false; diff(a)==1]; % true if index diff is one
a(repeat) = []; % remove those indices for non-first occurrence
result = m(a, 1); % what you want
...