2017-12-12 8 views
1

私はチェーンの形式で行列の乗算の問題があります。 私はマトリックスB <が保存されます、入力行列Aを持っている - 行列A は18ヶ月まで下記のファッション行列のnヶ月のループのための乗算

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

に乗算撮影した場所のこのチェーンを掛けする必要があります。 以下のコードを試してみましたが、どのループを選択するか選択できません。

マトリックスA:

2 3 
4 2 

コード:

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

b <- a 
b 

c = b %*% a 
c 

d <- c %*% b 
d 

e <- d %*% c 
e 

私は18回のチェーンループ方式でそれをやりたい、まで手動でこの乗算をしています。

予想される出力:

 [,1] [,2] 
[1,] 2 3 
[2,] 4 2 

B

 [,1] [,2] 
[1,] 2 3 
[2,] 4 2 

C = Bの%※%

C

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

D < - C%※%のB

D

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

E < - D%※%のC

電子

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

ので、これが18回繰り返されるべきです。助けてください。前もって感謝します。 forループ

+0

における乗算の結果を持っている( '%※%'、MGETを(文字[1:5])、= TRUE蓄積)' – akrun

+0

あなたは直接必要です18回後に答えるか、中間ステップを行列として必要とするでしょうか? –

+0

@akrun私はあなたのコードで試した:私は文字AとBについてのみ、したがってこれは動作していないと確信しています。それはループの中にあるはずです。 –

答えて

1

値が大きくなりすぎ以降と12ループからInfでの乗算結果は、リスト内の値を格納するコードを以下のR.

に格納されますマットル。最初の2つの要素は元の値AとBです。第三要素から以降、それがどのように `削減についてループ

A <- matrix(c(2L, 4L, 3L, 2L), 2, 2) 
matmull <- rep(list(A), 20) 
for(i in 1:18){ 
matmull[[i+2]] <- matmull[[i]]%*%matmull[[i+1]] 
} 
+0

ありがとうございました。 –

+0

2L、4L、3L、2Lは、行列が小さい場合の方が大きな値です。しかし、行列が12 * 12または18 * 18よりも大きい場合は、.csvからその行列を読み込むと問題が発生します。このケースを処理する汎用コードはありますか? –

+0

私はあなたのポイントを得ていませんでしたが、私はあなたが2L、4L、3L、2LをCSVファイルに書いていて、それを読み込もうとしていると仮定しています。 2L、4L ...フォームはRに整数であることを伝える方法なので、数値より少ないメモリしか使用しません。あなたは代わりに2、4、3、2を使うことができ、うまくいくでしょう。 csvでは2、4、3、2と書く必要があります。read.csvはデフォルトで数値として読み込まれます。 – Kushdesh

1

Aは、ここに役立ちます

matA <- matrix(c(2,4,3,2), ncol=2,nrow=2) 
output_var<- array(dim=c(2,2,18)) 
output_var[,,c(1:2)] <- matA 
for (i in c(3:18)) 
{ 
    output_var[,,i] <- output_var[,,(i-1)]%*% output_var[,,(i-2)] 
} 
output_var 
+0

私は月ごとに得られた(中間の)値を保存して使用したいと仮定しています。 –

+0

ガネーシュありがとうございました。 –