2013-06-10 3 views
2

나는 한 묶음의 데이터를 가지고 있습니다. 이제 더 깨끗한 /보다 효율적인 방법으로 데이터 필터링

big = [ 
    1 1 0.93 0.58; 
    1 2 0.40 0.34; 
    1 3 0.26 0.31; 
    1 4 0.40 0.26; 
    2 1 0.60 0.04; 
    2 2 0.84 0.55; 
    2 3 0.53 0.72; 
    2 4 0.00 0.39; 
    3 1 0.27 0.51; 
    3 2 0.46 0.18; 
    3 3 0.61 0.01; 
    3 4 0.07 0.04; 
    4 1 0.26 0.43; 
    4 2 0.77 0.91; 
    4 3 0.49 0.80; 
    4 4 0.40 0.55; 
    5 1 0.77 0.40; 
    5 2 0.91 0.28; 
    5 3 0.80 0.65; 
    5 4 0.05 0.06; 
    6 1 0.41 0.37; 
    6 2 0.11 0.87; 
    6 3 0.78 0.61; 
    6 4 0.87 0.51 
]; 

,의 내가 첫 번째 열은 3 또는 6 인 행을 없애하고 싶은 말은하자 다음과 같은 뭔가 (실제로 내 데이터는 약 50 만 행이 있습니다).

정말 좋아하는 일을 해요 : 작동하지만 루프가 제가 더 효율적인 트릭을 누락 생각하게

filterRows = [3 6]; 

for i = filterRows 
    big = big(~ismember(1:size(big,1), find(big(:,1) == i)), :); 
end 

합니다. 이 작업을 수행하는 더 좋은 방법이 있습니까?

원래 나는 시도 :

big(find(big(:,1) == filterRows),:) = []; 

하지만 작동하지 않습니다 물론.

답변

4

사용 logical indexing : 첫 번째 열의 값이 filterRows에 저장되어있는 일반적인 경우에,

rows = (big(:, 1) == 3 | big(:, 1) == 6); 
big(rows, :) = []; 

, 당신은 ismember과 논리적 벡터 rows을 생성 할 수 있습니다

rows = ismember(big(:, 1), filterRows); 

또는로 bsxfun :

rows = any(bsxfun(@eq, big(:, 1), filterRows(:).'), 2); 
+0

신속한 대응에 감사드립니다. 그 조건을 동적으로 구축 할 수있는 방법이 있습니까? 제거하려는 열은 수정되지 않습니다. – Griffin

+0

물론입니다. 'rows'는 조건이 만족되는 위치에서 논리 "1"(_i.e_'true')를 갖는 논리적 (_i.e_ boolean) 벡터입니다. 그런 다음'big (rows, :) = []'는 행렬'big'에서 제거합니다. 원하는 방식으로 인덱싱 벡터'rows'를 조작합니다. 즉, 원하는 논리에 따라 해당 행을 제거 할 위치에 'true'를 지정할 수 있습니다. –

+0

논리'rows' 벡터를 만드는 데 루프가 필요한 것처럼 들리니? – Griffin

관련 문제