2012-06-14 4 views
1

많은 나노 값을 가진 5000 행의 벡터에 대한 zscore를 계산하려고합니다. 루프를 사용하고 싶지 않아 여러 번 계산해야하는데 벡터화 된 솔루션을 찾고 싶었습니다.z 값이 matlab (벡터화 된)의 수치와 일치

루프 용액 :

for i = 1:end 
    vec(i,1) = (val(i,1) - nanmean(:,1))/nanstd(:,1) 
end 

부분 벡터화 용액하지만 이것은 벡터를 원래 벡터 유모 뺀 값의 길이를 반환

zscore(vec(find(isnan(vec(1:end) == 0)))) 

. 따라서 원래 크기와 같지 않습니다.

벡터에 대한 zscore를 계산 한 다음 단어 뒤에 누락 된 데이터를 보간하고 싶습니다. 따라서 100 초의 시간을 거쳐야하므로 빠른 벡터화 접근법을 찾고 있습니다.

퍼센트가 NaN의 일부 예시적인 데이터를 생성한다 :

답변

1

이 벡터화 용액이다.

val = reshape(magic(4), 16, 1); 
val(10) = NaN; 
val(17) = NaN; 

여기서 코드이다 :

valWithoutNaNs = val(~isnan(val)); 
valMean = mean(valWithoutNaNs); 
valSD = std(valWithoutNaNs); 
valZscore = (val-valMean)/valSD; 

그럼 열 벡터 valZscore이 편차 (Z 스코어)을 포함하고, val 원래 측정 데이터 NaNNaN 값을 갖는다.

+0

덕분에 당신은 그것을 잘 작동합니다. – user1129988

1

죄송이 답변이 늦었 6개월이지만, 다른 사람을 위해 사람이 스레드를 통해 제공 : 허용 대답은 완전히 실제 zscore 그렇게 아름답게 무엇을하지 않는다는 점에서 벡터화되지

: 그 행렬의 특정 차원을 따라 zscores를 수행합니다.

당신이 OP는 그가 가장 좋은 방법은 이것이다,하고있는 말한대로, 한 번에 벡터 많은 수의 zscores를 계산하려면 : 임의의 차원에서 그것을 할 수

Z = bsxfun(@divide, bsxfun(@minus, X, nanmean(X)) , 
        nanstd(X)); 

, 단지 넣어 nanmeannanstd 내부의 치수 및 bsxfun이 나머지를 처리합니다.

nanzscore = @(X,DIM) bsxfun(@divide, bsxfun(@minus, X, nanmean(X,DIM)), ... 
            nanstd(X,DIM)); 
0

익명 함수 :

nanZ = @ (시안) (XIN-nanmean (시안))/nanstd (시안); nanZ (vectorWithNans) 익명 함수 아래의

0

벡터화 버전

(관찰 행에있는 가정은 열 변수) :

nanZ = @(xIn)(xIn-repmat(nanmean(xIn),size(xIn,1),1))./repmat(nanstd(xIn),size(xIn,1),1); 
nanZ(matrixWithNans)