2017-09-19 2 views
1

의 행 및 열 인덱스를 효율적으로 매칭 I 두 n-by-1 인덱스 벡터 ab에 기초하여 논리 n-by-n 매트릭스 A을 만들려 같은 A에서 (i,j) 번째 요소 1 것을 경우에만, a(i)==b(j) . 다음과 같이이 작업을 수행하는하게 Matlab : 매트릭스

한 가지 방법은 다음과 같습니다이 방법

a = [1 1 2 3]'; 
    b = [2 3 1 3]'; 
    n = 4; 

    a_mat = repmat(a, [1 n]); 
    b_mat = repmat(b', [n 1]); 

    A = a_mat == b_mat; 

문제는이 n가 큰 경우 매우 메모리를 많이 사용하게한다는 것입니다. 더 큰 a_matb_mat 행렬을 만들 필요가없는보다 효율적인 접근법을 찾고 있는데 또한 합리적인 속도입니다.

답변

0

인해 MATLAB의 implicite expension에 (MATLAB R2016b 이상이 필요)

당신은 간단하게 작성할 수 있습니다

A = a==b.'; 

벤치 마크

n = 20000; 
    a = randi([1,100],1,n)'; 
    b = randi([1,100],1,n)'; 
    A = zeros(n,'logical'); 

    % Solution 1 
    tic 
    a_mat = repmat(a, [1 n]); 
    b_mat = repmat(b', [n 1]); 

    A = a_mat == b_mat; 
    toc 

    % Solution 2 
    tic 
    A = bsxfun(@eq, a, b'); 
    toc 

    % Solution 3 
    tic 
    A = a==b'; 
    toc 

Elapsed time is 24.357663 seconds. 
Elapsed time is 2.497311 seconds. 
Elapsed time is 2.120866 seconds. 

메모리 사용 측면에서 솔루션 2와 3은 매우 유사해야합니다. 행렬 A의 크기를 줄이기 위해 sparse(A)으로 계산이 완료되면 행렬을 희소하게 할 수도 있습니다.

+0

잘 알고 있기 때문에 암묵적인 확장이 작동하는지 궁금합니다. 불행히도 저는 아직 2016a에 아직도 걸려 있습니다 ... – Bob

0

괜찮아, 그냥 실제로는 오히려 사소한 대답 나 자신을 발견 (떠나거나 그냥 질문을 삭제할지 여부를 확실하지?) :

A = bsxfun(@eq, a, b'); 
+0

확실하지 않습니다. 하지만 값이 복잡 할 경우''로 대체해야합니다. –

+1

내 경우에는 인덱스 만 (자연수)이지만 일반적으로 그렇습니다! (그 경우에는 아마도 일치하는 것에 대해 어느 정도의 허용 오차를 지정해야 함) – Bob