2016-09-01 3 views
1

나는 두 행렬 AB을 곱하는 다음과 같은 기능을 작성했습니다 :함수를 조정하여 여러 (임의의 수의) 행렬을 곱하는 방법은 무엇입니까?

f <- function(A,B){ 
     m<-nrow(A) 
     n<-ncol(A) 
     n<-nrow(B) 
     p<-ncol(B) 
     Result<-matrix(0,nrow = m,ncol = p) 
     for(i in 1:m){ 
     for(j in 1:p){ 
      for(k in 1:n){ 
      Result[i,j]<-Result[i,j]+A[i,k]*B[k,j] 
      } 
      } 
     } 
     return(Result) 
     } 

내가 즉 다수의 3 이상, 내 기능 코드를 조정 할 방법 행렬보다는 2의 임의의 숫자?

+0

아니 당신이 정말로,하지만 왜 사용하지 않는'R's matmul 연산자 '%의 *의 %를'무슨 일 있는지? 그런 다음''Reduce ('% * %', list (A, B, C))''와 같은 것입니다. – cryo111

+0

흠, 오늘도 비슷한 코드를 보았습니다 ... 우리에게 숙제에 대한 질문을 던지십니까? – Axeman

답변

2

두 매트릭스 곱셈을 반복적으로 적용하면됩니다. 두 개의 행렬 AB을 곱하는 기본 함수가 f이라고합시다. 일반적으로 내부 하나의 %*%을 사용하지만 질문에 정의 된 것을 사용할 수 있습니다.

행렬의 수를 알 수 없으므로 ...을 사용하는 것이 좋습니다. 우리는 list(...)에 의해 "매트릭스 목록"에 입력 된 모든 매트릭스를 수집 한 다음 Reduce을 사용하여 2 개의 피연산자 매트릭스 곱셈을 누적 적으로 적용합니다.

g <- function (...) Reduce(f, list(...)) 

특히 매트릭스가 많은 경우 매트릭스 치수를 준수 할 책임은 귀하에게 있습니다. 다음에서는 사각형 행렬을 예제로 사용합니다.

set.seed(0) 
A <- matrix(rnorm(4),2) 
B <- matrix(rnorm(4),2) 
C <- matrix(rnorm(4),2) 
f <- "%*%" 

g(A, B, C) 
#   [,1]  [,2] 
#[1,] -3.753667 0.08634328 
#[2,] -0.161250 -1.54194176 

그리고 이것은뿐만 동일합니다

A %*% B %*% C 
#   [,1]  [,2] 
#[1,] -3.753667 0.08634328 
#[2,] -0.161250 -1.54194176 
관련 문제