2013-07-29 2 views
1

나는 각 연도의 24 개 값 (각 시간당 하나의 값)을 포함하는 행렬 A을 가지고 있습니다. A의 각 열은 다른 요일이며 매일 24 행의 데이터가 있습니다 (A은 24 x 365 임). 나는 매일의 시간 데이터를 비교함으로써 서로를 비교하려고한다. 이렇게하기 위해 데이터 한 열을 가져 와서 다음 열과 비교합니다. 두 열의 각 시간 데이터의 차이를 가져 와서 정사각형으로 합쳐서 이틀간의 유사도를 나타내는 단일 값을 얻습니다. 그런 다음 가능한 모든 조합으로이 작업을 수행하여 365 x 365 행렬 d을 작성하여 각 날이 서로 얼마나 유사한지를 나타냅니다. 예를 들어, 요소 d(20,100)은 연도의 20 번째 날이 100 번째와 얼마나 비슷한 지 나타내는 값을 포함합니다. 코드는 작동하지만 아주 느리고 벡터화 할 수 있기를 원합니다. 도움말 크게 감사하겠습니다.Matlab에서 double for loop를 벡터화하기

for j=1:365 
    for k=1:365 
     d(j,k)=sqrt(sum((A(:,j)-A(:,k)).^2)); 
    end 
end 

답변

5

인접 쌍 유클리드 거리 만들기 위해 C의 무거운 리프팅을 수행 pdist, 및 squareform를 사용하여 distance matrix :

d = squareform(pdist(A.')); 

이 될 필요가 있다면 더 빨리 (365별로 365 매우 크지는 않지만), 내 대답 here을 보거나 이것을 시도하십시오 File Exchange program.

4

당신은 horchler's answer를 이길 수는 없지만, 완성도 여기이이 사실 || x - y || = sqrt(||x||^2-2< x,y >+||y||^2) 것을 사용 bsxfun

d = bsxfun(@minus, permute(A, [3 2 1]), permute(A, [2 1 3])); 
d = sqrt(sum(d.^2, 3)); 

이 일을하는 또 다른 좋은 방법을 사용하여 수행 할 수있는 방법입니다. 따라서

n = sum(A.^2, 1); % norm of each vector 
b = bsxfun(@plus, n, n') - 2 * A' * A; 
관련 문제