how to find indices that fulfil a certain criteria
조회 수: 4 (최근 30일)
이전 댓글 표시
Lets say I want to write a script and the input is the following vector:
vector = [1 1 1 1 3 3 3 9 9 9 9 2 2 1 1 1 2 7 9 7 2 1 1 1]
I want the result to be a new vector that contain the indices [12 21] (the two 2's in bold and italic). The script should chose these indices because they are the first to follow index 7 and 17 (in bold) and at the same time have a value of that particular index +/- one... I hope it make sense and that it is doable. Thanks Michael
댓글 수: 0
채택된 답변
Iain
2014년 9월 17일
after_7 = 1:numel(vector) > 7;
after_17= 1:numel(vector) > 17;
twos_after_7 = vector == 2 & after_7;
twos_after_17 = vector == 2 & after_17;
output = find(twos_after_7,1,'first');
output(2) = find(twos_after_17,1,'first');
댓글 수: 2
Iain
2014년 9월 17일
편집: Iain
2014년 9월 17일
Ok... rereading it...
indexes = [7 17 64 504 3020]; %or whatever....
for i = 1:numel(indexes)
idx = indexes(i);
first_value = vector(idx);
after_value = 1:numel(vector) > idx;
hits = after_value & first_value > (vector-1) & (first_value < vector + 1);
result(i) = find(hits,1);
end
추가 답변 (1개)
Guillaume
2014년 9월 17일
편집: Guillaume
2014년 9월 17일
vector = [1 1 1 1 3 3 3 9 9 9 9 2 2 1 1 1 2 7 9 7 2 1 1 1];
refindices = [7 17];
outindices = zeros(size(refindices));
for refi = 1:numel(refindices)
refindex = refindices(refi);
outindex = find(abs(vector(refindex+1:end) - vector(refindex)) <= 1, 1);
if ~isempty(outindex)
outindices(refi) = refindex + outindex;
else
%whatever you want to do or nothing if you want 0 when criteria is not found
end
end
would be one way to do it.
Another option, sort of avoiding the loop (the loop is implemented by cellfun):
vector = [1 1 1 1 3 3 3 9 9 9 9 2 2 1 1 1 2 7 9 7 2 1 1 1];
refindices = [7 17];
splitvector = mat2cell(vector, 1, diff([1 refindices numel(vector)+1]));
outindices = refindices + cellfun(@(subv) find(abs(subv(2:end) - subv(1)) <= 1, 1), splitvector(2:end));
참고 항목
카테고리
Help Center 및 File Exchange에서 Matrix Indexing에 대해 자세히 알아보기
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!