解答例 - j1.lesson12.MatrixMult

package j1.lesson12;

import java.io.*;

/**
 * 課題1202 - 解答例.
 @author arakawa
 @version $Id: MatrixMult_java.rps,v 1.1 2006/03/06 12:56:15 java2005 Exp $
 */
public class MatrixMult {

    /**
     * 行列の掛け算を行うプログラム。
     * 以下の擬似コードで表される。
     <pre>
     * プログラム全体
     *     a = 3x3の新しい配列 (double[][])
     *     for i = 0 to 2
     *         for j = 0 to 2
     *             print &quot;a[&quot; i &quot;][&quot; j &quot;] = &quot;
     *             a[i][j] = コンソール入力 (実数)
     *     b = 3x3の新しい配列 (double[][])
     *     for i = 0 to 2
     *         for j = 0 to 2
     *             print &quot;b[&quot; i &quot;][&quot; j &quot;] = &quot;
     *             b[i][j] = コンソール入力 (実数)
     *     c = a * b
     *     print c
     </pre>
     @param args 無視される
     @throws IOException 入力中に例外が発生した場合
     */
    public static void main(String[] argsthrows IOException {
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        
        // a = 3x3の新しい配列 (double[][])
        double[][] a = new double[3][3];
        // for i = 0 to 2
        for (int i = 0; i <= 2; i++) {
            // for j = 0 to 2
            for (int j = 0; j <= 2; j++) {
                // print "a[" i "][" j "] = "
                System.out.print("a["+i+"]["+j+"] = ");
                // a[i][j] = コンソール入力 (実数)
                a[i][j= Double.parseDouble(reader.readLine());
            }
        }
        
        // b = 3x3の新しい配列 (double[][])
        double[][] b = new double[3][3];
        // for i = 0 to 2
        for (int i = 0; i <= 2; i++) {
            // for j = 0 to 2
            for (int j = 0; j <= 2; j++) {
                // print "b[" i "][" j "] = "
                System.out.print("b["+i+"]["+j+"] = ");
                // b[i][j] = コンソール入力 (実数)
                b[i][j= Double.parseDouble(reader.readLine());
            }
        }
        
        // c = a * b
        double[][] c = mult(a, b);
        
        // print c
        printMatrix(c);
    }
    
    /**
     * 3x3の行列の積を計算する。 
     * 以下の擬似コードで表される。
     <pre>
     * 3x3行列の積を計算(a, b)
     *     result = 3x3の新しい配列 (double[][])
     *     for i = 0 to 2
     *         for j = 0 to 2
     *             result[i][j] = Σ{k=0..2}(a[i][k] * b[k][j])
     *     result を返す
     </pre>
     @param a 掛けられる行列
     @param b 掛ける行列
     @return <code>a * b</code>
     */
    // 3x3行列の積を計算(a, b)
    public static double[][] mult(double[][] a, double[][] b) {
        // result = 3x3の新しい配列 (double[][])
        double[][] result = new double[3][3];
        
        // for i = 0 to 2
        for (int i = 0; i <= 2; i++) {
            // for j = 0 to 2
            for (int j = 0; j <= 2; j++) {
                // result[i][j] = Σ{k=0..2}(a[i][k] * b[k][j])
                double sum = 0;
                for (int k = 0; k <= 2; k++) {
                    sum += a[i][k* b[k][j];
                }
                result[i][j= sum;
            }
        }
        
        // result を返す
        return result;
    }
    
    /**
     * 行列を表示する。
     * 以下の擬似コードで表される。
     <pre>
     * 行列の表示(matrix)
     *     for i = 0 to matrixの長さ - 1
     *         for j = 0 to matrix[i]の長さ - 1
     *             print matrix[i][j] &quot; &quot;
     *         print 改行
     * </pre>
     @param matrix 表示する行列
     */
    // 行列の表示(matrix)
    public static void printMatrix(double[][] matrix) {
        // for i = 0 to matrixの長さ - 1
        for (int i = 0; i < matrix.length; i++) {
            // for j = 0 to matrix[i]の長さ - 1
            for (int j = 0; j < matrix[i].length; j++) {
                // print matrix[i][j] " "
                System.out.print(matrix[i][j]);
                System.out.print(" ");
            }
            // print 改行
            System.out.println();
        }
    }
}