2012-04-16 3 views
0

입력 벡터에 대해 아래 함수를 실행할 때 일관성없는 결과가 나타납니다. 벡터화 된 입력이 사용될 때 출력 열의 순서가 변경된 것처럼 보입니다. 이 함수를 벡터화하는 더 좋은 방법이 있습니까?배열 함수가 출력 열을 잘못 재정렬 함

func <- function(t, alpha) { exp(matrix(-rep(t,7), ncol=7)*1:7*alpha) } 

# correct  
rbind(func(3, 0.02), func(4, 0.02)) 

#incorrect 
func(c(3, 4), 0.02) 

> rbind(func(3, 0.02), func(4, 0.02)) 
      [,1]  [,2]  [,3]  [,4]  [,5]  [,6]  [,7] 
[1,] 0.9417645 0.8869204 0.8352702 0.7866279 0.7408182 0.6976763 0.6570468 
[2,] 0.9231163 0.8521438 0.7866279 0.7261490 0.6703200 0.6187834 0.5712091 

> func(c(3, 4), 0.02) 
      [,1]  [,2]  [,3]  [,4]  [,5]  [,6]  [,7] 
[1,] 0.9417645 0.8352702 0.7408182 0.6570468 0.8869204 0.7866279 0.6976763 
[2,] 0.8521438 0.7261490 0.6187834 0.9231163 0.7866279 0.6703200 0.5712091 

답변

2

결과에 대한 잘못되거나 일치하지 않는 것도, 작업이 적용되는 요소별로 요소 만 R의 ​​재활용 규칙의 이해와 방법이 없습니다. ;-)

R은 열 주요 순서 (재활용 규칙 포함)로 개체를 저장하고 작동합니다. 귀하의 예는 R이 행 우선 순위 인 경우에만 작동합니다. 열 - 주요 순서는 matrix(-rep(t,7), ncol=7)*1:7 같은 결과를 의미 내부적으로, 행렬 dim 속성 단지 벡터이다, 때문에

3*1 3*3 3*5 3*7 3*2 3*4 3*6 
4*2 4*4 4*6 4*1 4*3 4*5 4*7 

이입니다.

> as.vector(matrix(-rep(3:4,7), ncol=7)) 
[1] -3 -4 -3 -4 -3 -4 -3 -4 -3 -4 -3 -4 -3 -4 

벡터의 처음 두 요소가 행렬의 첫 번째 열인 방법을 확인하십시오. 따라서 1:7을 곱하면 "일치하지 않는"결과가 발생합니다. 다시

> (foo <- as.vector(matrix(-rep(3:4,7), ncol=7)) * 1:7) 
[1] -3 -8 -9 -16 -15 -24 -21 -4 -6 -12 -12 -20 -18 -28 

를 켭를 통해 "매트릭스"로 : : 당신은 정말하고 R을 요구하고

> dim(foo) <- c(2,7) 
> foo 
    [,1] [,2] [,3] [,4] [,5] [,6] [,7] 
[1,] -3 -9 -15 -21 -6 -12 -18 
[2,] -8 -16 -24 -4 -12 -20 -28 

당신이 재활용 규칙을 활용하려는 경우와 함께 시작해야 현재 매트릭스의 전치. 그런 다음 1:7을 곱하고 그 결과를 조 변경하십시오. transpose에 대해 말하면, 변수 이름을 t으로 지정하는 것을 피할 수 있습니다. 그 이유는 이것이 조바꿈 함수의 이름이기 때문입니다.

func <- function(v, alpha) { 
    t(exp(matrix(-rep(v,7), nrow=7, byrow=TRUE)*1:7*alpha)) 
} 
+0

답변 해 주셔서 감사합니다. 컬럼 기본과 행 우선 순서에 대한 자세한 내용도 알고 있습니다. (위키피디아에서 이것을 보려고합니다). R이 예상대로 작동하고 있다고 가정했는데 논리에 대해 더 깊이 이해해야했습니다. – user338714

1

이 작동합니다 :

func <- function (t,alpha) exp(-rep(t,7) * sapply(1:7,rep,length(t)) * alpha)