получить последние x элементов (которые являются истинными) в логическом векторе - PullRequest
0 голосов
/ 29 августа 2018

У меня есть простая проблема, и мне было интересно, есть ли более быстрый способ (т. Е. Однострочный или менее строк кода), чтобы получить последние значения X, которые являются истинными из логического вектора.

вот что у меня есть:

%define variables
vec=logical([0 1 1 0 0 1 0 1 0 0 1 1 1 0 0 1]);
lastX=3;
%my approach
idx=find(vec); %find indices of values that are true
idx=idx(end-lastX+1:end); %find last X true values
vec(setxor(1:size(vec,2),idx))=0; %get values that are not in idx, set them false
vec %display output, should report [0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1]

Ответы [ 3 ]

0 голосов
/ 29 августа 2018

Вы можете использовать cumsum для подсчета количества вхождений true, начиная с конца вектора до начала, используя флаг направления 'reverse'. Если число больше, чем вы хотите lastX, этот элемент в vec должен быть false:

vec(cumsum(vec, 'reverse') > lastX) = false;
0 голосов
/ 30 августа 2018

Раствор с regexp. Вероятно, очень неэффективно; в основном для развлечения:

vec(1:regexp(char(vec+'0'),[repmat('10*',1,lastX) '$'])-1) = false;
0 голосов
/ 29 августа 2018

Вы можете сделать простой однострочник, используя дополнительные аргументы для find (указав количество значений для поиска и с какого конца их искать), а затем получив минимум Индекс возвращен:

vec(1:(min(find(vec, lastX, 'last'))-1)) = false;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...