2017-12-12 7 views
2

私はチェーンの形式で行列乗算の問題があります。私は、入力行列Aを持つマトリックスB <が保存されます - 行列Aは、乗算する必要があり、以下の方法でループを使用した行列乗算

C = B * A 
D = C * A 
E = D * A 

Aは、各月のすべての乗算のための参照行列です。 この乗算の連鎖は18ヶ月まで行われました。

マトリックスA:

2 3 
4 2 

コード:

a = matrix(c(2, 3, 4, 2), nrow=2, ncol=2, byrow = TRUE) 
b <- a 
c <- b %*% a 
d <- c %*% a 
e <- d %*% a 
f <- e %*% a 
g <- f %*% a 

たびAは、結果との将来の乗算のために参照行列です。これを18回繰り返した。

上記の乗算を手動で18回右にする必要があるため、ループを探してください。

予想される出力:

C < - のb%※%

C

 [,1] [,2] 
[1,] 16 12 
[2,] 16 16 

D < - Cの%※%

D

 [,1] [,2] 
[1,] 80 72 
[2,] 96 80 

E < - D%※%

E

 [,1] [,2] 
[1,] 448 384 
[2,] 512 448 

< F - E%※%

F

 [,1] [,2] 
[1,] 2432 2112 
[2,] 2816 2432 

ですので、18回繰り返す必要があります。助けてください。前もって感謝します。

ロジックは以前の質問とは異なります。

+0

あなたはすべての行列のみ最後の結果が必要ですか?このタスクのために独自の関数を記述することができます。 – jogo

+1

すべての18個の行列 –

+1

[nヶ月のループの行列の複素数]の可能な複製(https://stackoverflow.com/questions/47765860/matrix-multiplication-for-n-number-of-months ) –

答えて

3

あなたが行うことができます。

Mpow <- function(A, n) { 
    if (n==1) return(list(A)) 
    L <- list(A) 
    P <- A 
    for (i in 2:n) { 
    P <- P %*% A 
    L[[i]] <- P 
    } 
    return(L) 
} 

a = matrix(c(2, 3, 4, 2), nrow=2, ncol=2, byrow = TRUE) 
Mpow(a, 1) 
Mpow(a, 2) 
Mpow(a, 18) 

あなたは行列の権限のリストを取得します。問題の行列fは、Mpow(a,5)の最後の要素です。あなたが行うことができ、新たな機能を定義することなく

Mpow <- function(A, n) { 
    L <- list(A) 
    if (n==1) return(L) 
    P <- A 
    for (i in 2:n) L[[i]] <- (P <- P %*% A) 
    return(L) 
} 


はここでは、関数の短いバリアントをある

n <- 5 
Reduce('%*%', rep(list(a), n), accumulate=TRUE)