2014-04-18 5 views
0

2 차원 매트릭스를 사용하여 2 차원 매트릭스 결과를 생성하려고합니다. 변경할 때마다 행 수와 열 수가 새로운 방식으로 결정됩니다. 함수의 값으로 행 수와 열 수를 결정합니다. 내가 할subscript out bounds 함수 내에서 두 개의 for 루프가있는 경우

HRC <- function(n,b,c) 
{ 
R=matrix(,nrow = n*b, ncol = c) 
R[0,]=133 
for (j in 1:c) 
{ 
r=rnorm(n*b) 
for (i in 1:n*b){ 
R[i+1,j]=R[i,j]+3*b/r[i] 
} 
} 
return(R) 
} 

HRC(10,1,3) 

오류 메시지는 다음과 같습니다 :

Error in R[i + 1, j] = R[i, j] + 3 * b/r[i] : subscript out of bounds 

내가 궁금해 물어와 "아웃 오브 바운드 첨자"를 해결하고자하는 기능은 문제는 다음과 같다 이 문제를 해결할 수 있습니다. 미리 감사드립니다.

답변

0

을 문제는 당신이 행 b에서 루프 다음 ​​인덱스 큰 하나, 당신이 그렇게 (때문에 *:의 우선 순위에, 보폭 b와) n*b 행하고 있다는 것입니다 범위를 벗어나는 행 n*b + 1R으로 인덱싱하려고 시도합니다.

R[0,]<- 내가 만약 당신이 루프 2에서 행의 수, n*b을 읽고, 작성 행의 측면에서 수식을 작성하는 쉽게 코드를 찾을 R.

에서 이끌어내는 오류가 잘못된 결과를 야기하지만,하지 않습니다 ii-1 (행 i에서 행 i+1을 생성하는 대신).

또한 행상에서 동작을 벡터화하여 하나 개의 루프 사이즈 떨어질 수 여기

HRC <- function(n, b, c) { 
    R <- matrix(NA, nrow = n*b, ncol = c) 
    R[1,] <- 133 

    r <- matrix(rnorm(n*b*c), ncol=c) 
    for (i in 2:(n*b)){ 
    R[i,] <- R[i-1,] + 3*b/r[i-1,] 
    } 

    return(R) 
} 


HRC(10,1,3) 

은 랜덤 샘플의 동일한 번호 rnorm로 촬영하고 있지만 이들은 매트릭스로 형성되고, 사용 질문에 사용 된 것과 같은 순서로 모든 랜덤 값이 실제로 계산에 사용되는 것은 아닙니다.

임의의 시드를 설정 한 다음이 함수를 실행하고 @ flodel의 대답에 함수를 사용하면 동일한 결과가 나타납니다. 그의 대답도 정확합니다.

첫째 : 당신은 행이 인덱스에 의지 엉망으로되어

+0

색인 생성 및 명확한 설명에 대한 매우 명확한 설명을 해주셔서 대단히 감사합니다! 나는 정말 큰 도움이되었다! 정말 고맙습니다! –

1

R의 인덱싱은 1에서 시작하며 0이 아닙니다.

연산자 우선 순위 규칙도주의해야합니다. : 연산자의 우선 순위는 *보다 높습니다. ?Syntax을 참조하십시오.

이 작동합니다 :

HRC <- function(n, b, c) { 
    R <- matrix(NA, nrow = n*b, ncol = c) 
    R[1,]=133 
    for (j in 1:c) { 
    r = rnorm(n*b) 
    for (i in 1:(n*b-1)){ 
     R[i+1,j] = R[i,j] + 3*b/r[i] 
    } 
    } 
    return(R) 
} 

HRC(10,1,3) 
+0

대단히 감사합니다! 정말 큰 도움이되었습니다! –

0

난 당신이 세 가지 실수를하고있다 생각합니다. 그것은 1:(n*b)이어야하며 1:n*b이 아야합니다.

둘째 : 색인 생성은 1부터 시작합니다. 따라서 R[0,]R[1,]으로 바꿔야합니다.

세 번째 : 오른쪽 경계 인 1:c1:(n:b)에서 루프를 실행하고 있지만 색인을 추적하지 못하고 있습니다.

이 시도 :

set.seed(100) 
HRC <- function(n, b, c) { 
    R <- matrix(0, nrow = n*b, ncol = c) 
    R[1,] <- 133 
    for (j in 1:c) { 
    r <- rnorm(n*b) 
    for (i in 2:(n*b)){ 
     R[i,j] <- R[i-1,j] + 3*b/r[i-1] 
    } 
    } 
    return(R) 
} 

HRC(10,1,3) 

마지막으로, 나는 할당 연산자의 상호 교환 사용에 대해 경고하고 싶습니다. here을 참조하십시오.

+0

그것에 대해 더 명확하게 해주셔서 고마워요! 나는 정말로 그것을 바르게 평가한다! 정말 고맙습니다! –