2009-06-30 6 views
0

0.01으로 다른 요소와 다른 경우 MATLAB에서 매트릭스 요소를 제거하는 방법을 알아 내려고합니다. 나는 내가 만들고있는 ROC 커브에 대한 thresholding 값으로 행렬의 고유 한 요소를 모두 사용하기로되어 있지만, 서로 0.01 이내의 값을 제거 할 방법이 필요합니다. 이것이 사실이라면 기본적으로 같음).매트릭스에서 비슷한 요소 제거

그리고 도움을 주시면 대단히 감사하겠습니다!

감사합니다.

+1

값 체인이 있다면? 예 : 귀하의 행렬은 0, .005, .01, .015, .02, .025 등을 포함합니다. 첫 번째는 두 번째, 두 번째는 세 번째 등등입니다. 그것은 그들이 모두 동등한 것을 의미 할 것입니다, 그러나 그것은 아마도 당신이 원하는 것이 아닙니다, 그렇습니까? – balpha

+0

임의의 차원 수의 행렬에 대해 비율을 조정해야합니까? 아니면 어떻게 든 제한됩니까? '제거'라고 말하면 남아있는 행렬이 희소하다고 생각합니다. 그게 맞습니까? 아니면 그것보다 간단합니까? –

+0

제가 지금 작업하고있는 행렬은 지정된 2D 크기를 갖습니다 (결국 10,000x10,000만큼 커질 것입니다). 나는 제거 부분을 충분히 설명하지는 않았지만 지금 생각해 보았습니다. 처음에는 모든 행렬 값을 벡터에 넣었습니다. 그런 다음 벡터를 거치고 0.01 미만 차이가 나는 값을 제거해야합니다 (0.01 미만 차이가 나는 경우 동일한 값임을 가정합니다) –

답변

1

행렬의 모든 요소가 두 개의 정점 (u, v) 사이의 에지가 0.01 미만인 경우 에지가 있도록 그래프 G = (V, E)를 형성하십시오. 이제이 그래프에 대한 인접 행렬을 만들고 가장 큰 차수의 원소를 찾으십시오. 그것을 제거하고 목록에 추가하고 그래프에서 이웃을 제거하고 요소가 남아 있지 않을 때까지 반복하십시오.

CODE :하여 매트릭스 n 개의 요소 여기서

%% Toy dataset 
    M = [1 1.005 2 ;2.005 2.009 3; 3.01 3.001 3.005]; 
    M = M(:); 
    A = false(numel(M),numel(M)); 
    for i=1:numel(M) 
     ind = abs(M-M(i))<=0.01; 
     A(i,ind) = 1; 
    end 
    C = []; 
    while any(A(:)) 
     [val ind] = max(sum(A)); 
     C(end+1) = M(ind); 
     A(A(ind,:),:) = 0; 
    end 

이것은 런타임의 O (N^2)를 갖는다. 그래, 천천히.

3

당신은 단순히 벡터에서 그 허용 범위 내에 인접한 값을 제거하려는 경우,이 같은 시작 것 :

roc = ... 

tolerance = 0.1; 
idx = [logical(1) diff(roc)>tolerance)]; 
rocReduced = roc(idx); 

가 'rocReduced'

이제 'didn를 모든 값을 가진 벡터이다 원래 벡터의 허용 오차 내에서 인접한 값을 갖는다.

  1. 원래 '로코'벡터는 단순해야합니다 :

    이 방법은 두 가지 한계가있다.

  2. 한 줄에 두 개 이상의 항목이 허용 오차 이내 일 수 있습니다. 그렇지 않으면 전체 폭표가 제거됩니다.

위의 내용이 충분하지 않다고 생각됩니다. 즉, 벡터화 된 행렬 연산을 사용하는 동안 이러한 (및 기타) 제한을 극복하는 간단한 연산은 생각할 수 없습니다. 성능은 큰 문제가되지 않는 경우

, 당신은 아마 다음과 같은 반복적 인 알고리즘은 사용자의 응용 프로그램에 맞춰 것 :

roc = ... 
tolerance = 0.1; 
mask = true(size(roc)); % Start with all points 
last = 1; % Always taking first point 
for i=2:length(roc) % for all remaining points, 
    if(abs(roc(i)-roc(last))<tolerance) % If this point is within the tolerance of the last accepted point, remove it from the mask; 
    mask(i) = false; 
    else % Otherwise, keep it and mark the last kept 
    last = i; 
    end 
end 
rocReduced = roc(mask); 

이 반드시 모든 버리는없이 연속 된 여러 하위 허용 오차 간격을 처리합니다. 비 단조 시퀀스도 처리합니다.

MATLAB 사용자는 종종 반복 솔루션 (벡터화 된 행렬 연산)에서 벗어날 수 있지만 때로는 무차별 대입 성능이 사용자의 요구를 충족시킬 때보다 우아한 솔루션을 찾는 데는 가치가 없습니다.

1

설명을 통해 (이미 주석에서 지적한대로) 일련의 값을 처리하는 방법이 명확하지 않습니다. 0.0 0.05 0.1 0.15 ... 행렬에서 요소를 제거하면 실제로 무엇을 의미합니까? 0으로 설정하고 전체 열을 제거하고 전체 행을 제거 하시겠습니까?벡터를 들어

, 그것은 (아담스 솔루션과 유사)

roc = ... 
tolerance = 0.1; 

% sort it first to get the similar values in a row 
[rocSorted, sortIdx] = sort(roc); 

% find the differing values and get their indices 
idx = [logical(1); diff(rocSorted)>tolerance)]; 
sortIdxReduced = sortIdx(idx); 

% select only the relevant parts from the original vector (revert sorting) 
rocReduced = roc(sort(sortIdxReduced)); 

코드는 안된처럼 보일 수 있지만 희망이 작동합니다.

0

임계 값 또는 허용 오차를 사용하여 충분히 가까운 값을 유지하기 전에 matlab inbuilt unique()을 사용하여 실행을 줄일 수 있습니다. 보통 matlab은 inbuilts를 가속화하려고 시도합니다. 가능한 한 많은 inbuilts를 사용하려고합니다.