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) 
     } 

どのように私はむしろちょうど2以上の行列の乱数、すなわち、複数の3以上に自分の機能コードを調整するのでしょうか?

+0

ないあなたが本当に何をしているかを確認しますが、なぜあなたは 'R's MATMULオペレータ'%※% 'を使用していませんか? '' Reduce( '%*%'、list(A、B、C)) ''のようなものです。 – cryo111

+0

今日、私は同じようなコードを見てきました...私たちに宿題に関する質問をしましたか? – Axeman

答えて

2

2行列の乗算を反復的に適用するだけです。 fを、2つの行列ABを乗算する基本関数とします。通常は内部の%*%を使用しますが、質問に定義されているものを使用することができます。

行列の数は不明なので、...を使用することをお勧めします。我々は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 
関連する問題