2013-06-15 3 views
2

원래의 행렬에있는 해당 열의 원래 값의 제곱의 합계의 제곱근으로 각 원래 값을 나눔으로써 어떻게 얻을 수 있습니까?행렬의 각 값을 해당 행렬의 각 열의 합계를 제곱근으로 나누는 방법은 무엇입니까?

data(longley) 
X <- as.matrix(longley[,-7]) 

X/sqrt(colSums(X^2)) 

잘못된 결과 얻기.

+0

결과에 어떤 문제가 있는지에 정교한하시기 바랍니다. – Roland

+0

sqrt (colSums (X^2))'괜찮 으면서 ('apply'보다 훨씬 빠르지 만)'X/... '할 때'sqrt (colSums (X^2))'의 결과는 전체적으로 재활용됩니다 열과 그래서 당신은 "잘못된 결과"를 얻을. – Michele

답변

3

이 방법이 효과가 있습니까?

data(longley) 
X <- as.matrix(longley[,-7]) 

X <- apply(X, 2 , function(x) x/sqrt(sum(x^2))) 
+1

익명의 기능에 오타가 있습니다. 합계에서 소문자 x 여야합니다. – Roland

+0

덕분에 복사 및 붙여 넣기로 인해 ... – Michele

+0

감사. 간단한 타이핑 실수가 있습니다. X <- (X, 2, function (x) x/sqrt (sum (x^2))) 감사합니다. –

4

이 시도 :

t(t(X)/sqrt(colSums(X^2))) 

벤치 마크 :

library(microbenchmark) 
microbenchmark(t(t(X)/sqrt(colSums(X^2))), 
       apply(X, 2 , function(x) x/sqrt(sum(x^2)))) 
# Unit: microseconds 
#          expr  min  lq median  uq  max neval 
# t(t(X)/sqrt(colSums(X^2)))     28.783 33.1305 34.9455 40.5640 68.147 100 
# apply(X, 2, function(x) x/sqrt(sum(x^2))) 100.307 105.1940 106.9975 108.1075 193.015 100 
+0

이것은 더 빠르며 대수에서 이러한 연산이 어떻게 수행되는지에 대한 아이디어를 제공합니다. 공연. – Michele

+0

예상대로! 'colSums' 대'apply (X, 2, sum)'는 빠르다고 알려져 있습니다. (어쨌든, 이미 upvoted) – Michele

관련 문제