2014-06-23 3 views
0

다음 문제 참조하십시오 분명히MATLAB의 상관 관계에서 중복을 제거하는

P=rand(4,4); 

for i=1:size(P,2) 
for j=1:size(P,2) 
    [r,p]=corr(P(:,i),P(:,j)) 
end 
end 

는, 루프가 상관 관계의 수를하게됩니다 것은 두 배가 될 수 (즉, CORR (P (: 1), P (: 4)) 및 CORR (P (: 4), P는 (:.?, 1)) 사람이 아마도 루프를 사용하지 않고이를 방지하는 방법에 대한 제안이 있습니까

감사

답변

1

I는 정확히에 따라 네 가지 제안이 너는 공동으로하고있다. 당신의 매트릭스를 모방하십시오. 나는 당신이 준 예제가 수행되어야 할 것을 단순화 한 버전이라고 가정하고 있습니다.

첫 번째 방법 - 당신이 할 수

한 가지에만 i까지 1에서 이동 있도록 j 루프 인덱스를 변경 인 내부 루프 인덱스를 조정. 이렇게하면 낮은 삼각형 행렬을 얻고 행렬의 아래쪽 삼각형 절반에있는 값에 집중할 수 있습니다. 상반부는 기본적으로 모두 0으로 설정됩니다. 변경을 남겨,하지만 당신은 가서 당신이 전체 두 for 루프가 전에했던 것처럼 같은 매트릭스를 사용할 수 있습니다 unique

를 사용하지만, 다음 수 -

for i = 1 : size(P,2) 
    for j = 1 : i 
    %// Your code here 
    end 
end 

두 번째 방법은 : 즉 unique을 사용하여 중복 된 내용을 필터링하십시오. 즉,이 작업을 수행 할 수 있습니다

[Y,indices] = unique(P); 

Y 매트릭스 P 내에서 당신에게 고유 한 값의 목록을 제공하고 indices 다음은 P 내에서 발생당신에게 위치를 제공 할 것입니다. - 사용 pdistsquareform

[rows,cols] = ind2sub(size(P), indices); 

세 번째 방법 : 이러한 주요 지수는, 그래서 당신은이 위치가 발생하는 곳의 행과 열 위치를 발견하기를 원한다면, 당신이 할 수 있습니다 루프가 필요없는 솔루션을 찾고 있으므로 pdist 함수를 살펴보십시오. M x N 행렬이 주어진 경우 pdist은 행렬의 각 행 쌍 사이에 거리를 찾습니다. squareform 그런 다음 위와 같이 거리를 매트릭스로 변환합니다.즉,이 작업을 수행 : -이에

[rho, pvals] = corr(P); 

corr

dists = pdist(P.', 'correlation'); 
distMatrix = squareform(dists); 

네 번째 방법은 바로 다음과 같은 방법으로 corr을 사용할 수 있습니다

바로 상자 밖으로 corr 방법을 사용 경우 m x m 행렬의 각 쌍 사이에 상관 계수가 포함되어 있습니다. n x m 행렬은 P에 저장됩니다.


하나만 있으면됩니다.

+0

정말 고마워요. 첫 번째 방법은 내 코드의 특성상 가장 잘 작동합니다. 이 예제는 단순화 된 버전입니다. –

+0

@A.Rainer - 대단히 환영합니다. 다행스럽게 도울 수있어! – rayryeng

+1

+1은 세 번째 방법이고 .... '는 :-) –

0

이?! 작동합니까?

for i=1:size(P,2) 
for j=1:i 
그냥 다른 각각의 열을 상호 연관되어 있기 때문에 0
0

은, 왜 그냥 http://www.mathworks.com/help/stats/corr.html에 따르면, 통계 도구 상자를 가지고 있지만하지 않는

[Rho,Pval] = corr(P); 

(직선 문서에서)를 사용하지

CORR (X)는 N 바이 P 매트릭스 X.의 열들의 각 쌍 사이의 쌍대 선형 상관 계수를 포함하는 P 별 P 매트릭스를 반환

+0

그건 사실입니다. 내 질문에 언급하지 않은 것은 상관 관계가 실제로 나중에 수행되었다는 것이었고 루프도 다른 것을위한 것이 었습니다. 그래도 감사합니다. –