2013-07-19 3 views
3

많은 매트릭스가있는 큰 매트릭스 X가 있다고 가정 해 봅시다. 물론 메모리와 CPU를 절약하기 위해 스파 스 매트릭스로 만듭니다. 그 후에 나는 어떤 것을하고 어떤 시점에서 나는 0이 아닌 요소를 갖고 싶습니다. 스파 스 매트릭스의 구조가 정보의 직접 추출을 허용해야하기 때문에 이것은 그러나 오히려 바보 나에게 보이는희소 매트릭스의 0이 아닌 요소

ind = M ~= 0; % Whereby M is the sparse Matrix 

: 내 코드는 다음과 같이 보입니다.

명확히하기 : 나는 작동하는 해결책을 찾지 않지만 같은 것을 두 번하는 것을 피하고 싶습니다. 스파 스 매트릭스는 그것이 0이 아닌 값이라는 것을 이미 알고 있어야하므로 검색 할 필요가 없습니다.

당신은

답변

2

스파 스 매트릭스에서 0이 아닌 요소를 검색하는 직접적인 방법은 nonzeros()입니다.

직접적인 방법 그러나 I은 (결과 희소성 패턴 치수에 의존 성긴 및 full() 상대방과 전자가 빠르다에 인덱싱 논리적 인덱싱 대해 몇 가지 테스트를 수행 분명히 빠른 방법 행렬의).

시간의 합계 100 개 이상의 반복은 다음

nonzeros: 0.02657 seconds 
sparse idx: 0.52946 seconds 
full idx: 2.27051 seconds 

테스팅 스위트 :

N = 100; 
t = zeros(N,3); 
for ii = 1:N 
    s = sprand(10000,1000,0.01); 
    r = full(s); 

    % Direct call nonzeros 
    tic 
    nonzeros(s); 
    t(ii,1) = toc; 

    % Indexing sparse 
    tic 
    full(s(s ~= 0)); 
    t(ii,2) = toc; 

    % Indexing full 
    tic 
    r(r~=0); 
    t(ii,3) = toc; 
end 

sum(t) 
+0

전체 및 스파 스에 대한 코드 또는 의견이 전환 된 것처럼 보입니다. –

+0

@DennisJaheruddin 그렇지 않습니다. 'r'은 이미 꽉 차서 최종 결과를 얻으려면's (...)'를 풀로 변환해야하고 그 단계는 타이밍에 해당합니다. – Oleg

+0

예, 이것은 실제로 내가 찾고 있었던 것입니다 (나는 nonzeros를 의미합니다). 동일한 작업 (두 번 인덱싱)을 수행하는 것은 나에게 어리석은 것처럼 보였습니다. 대답은 Thx입니다. –

1

당신이 계신 100 % 확실하지 않다하지만 어쩌면 [r c] = find(M) 정장 당신에게 더 나은 magu_?

M(r,c)으로 M의 값을 얻을 수 있지만 가장 좋은 방법은 다음 데이터로 수행 할 작업에 의해 결정됩니다.

1

find 기능 MATLAB 추천 :

[행 COL = find (X, ...)는 행렬 X의 0이 아닌 항목의 행 및 열 색인을 반환합니다. 이 synt 도끼는 스파 스 행렬로 작업 할 때 특히 유용합니다. .

[r,c,v] = find(M); 

당신이 인덱스는 R, C,뿐만 아니라 비 - 제로 값 V 사용뿐만 아니라 제공합니다 : find 동안

+0

Find는 스파 스 오브젝트가 이미 저장 한 서브 벡터를 검색합니다. 'nonzeros()'는 추가 색인없이 값을 직접 가져옵니다. – Oleg

1

내가이 중요한뿐만 아니라 생각, 이전에 제안되었다 nonzeros 명령이 조금 빠르지 만 찾기은 [r, c, v] 벡터가 전체 행렬 (행렬 차원 제외)을 설명하기 때문에 일반적으로 스파 스 행렬을 처리 할 때 매우 유용합니다.

관련 문제