2017-09-06 17 views
2

単純な行列乗算をJavaで実装しようとしています。ここでは行列を2次元ArrayListに格納しています。エラーは、ネストされたforループの内部にあるResultという行列の設定によって引き起こされたように見えますが、なぜそれは理解できません。2次元配列リストを使用したJavaでの行列乗算

import java.util.ArrayList; 
import java.util.Collections; 
import java.util.Arrays; 

public class Test { 

    public static void main(String args[]) { 
     int n = 2; 

     ArrayList<ArrayList<Integer>> Result = new ArrayList<ArrayList<Integer>>(Collections.nCopies(n, new ArrayList<Integer>(Collections.nCopies(n, 0)))); 
     ArrayList<ArrayList<Integer>> A = new ArrayList<ArrayList<Integer>>(); 
     ArrayList<ArrayList<Integer>> B = new ArrayList<ArrayList<Integer>>();      

     A.add(new ArrayList<Integer>(Arrays.asList(1, 6))); 
     A.add(new ArrayList<Integer>(Arrays.asList(2, 2))); 
     B.add(new ArrayList<Integer>(Arrays.asList(0, 9))); 
     B.add(new ArrayList<Integer>(Arrays.asList(5, 6))); 

     for (int i = 0; i < n; i++){ 
      for (int j = 0; j < n; j++){ 
       for (int k = 0; k < n; k++){ 
        int val = A.get(i).get(k) * B.get(k).get(j); 
        Result.get(i).set(j, Result.get(i).get(j) + val); 
       } 
      } 
     } 
    } 
} 

実際にはA * B = [[30, 45], [10, 30]]なければならないときにコードが結果A * B = [[40, 75], [40, 75]]を生成します。

答えて

2

Resultが正しく初期化されていません。

ArrayList<ArrayList<Integer>> Result = new ArrayList<ArrayList<Integer>>(
    Collections.nCopies(n, 
     new ArrayList<Integer>(Collections.nCopies(n, 0)))); 

これは(あなたがそれを見てどのように応じて、または列)二列行列を作成は二回参照事実、同じ行(列)、です。

あなたはそのようなResultを初期化することができます

List<List<Integer>> result = new ArrayList<>(); 
for (int i = 0; i < n; i++) { 
    result.add(new ArrayList<>(Collections.nCopies(n, 0))); 
} 
+0

は、トリックを行うこと、ありがとうございました。 – Jeppeks1