何事も好きになれないと辛い...、プログラミングが好きになる日は来るのだろうか...、それはそれとして今日もJavaで行列

いや~、今日も人生について考えることしきりです、どうもボクです。年末年始の帰省で将来的に実家を売り払うという話が出て、帰る故郷が無くなることを知り2019年も暗黒面に沈みそうな心持ちの我輩ではありますが、みなさんいかがお過ごしでしょうか。

あまりの衝撃に、東京のアパートに戻ってきてから、Amazonで本棚を衝動買いしてしまった次第です。


山善 本棚 コミック収納ラック 4段 幅60×奥行17×高さ89cm 耐荷重50kg ホワイト CMCR-9060(WH)

⇧  これで、床に平積みしていた本が片付くかしらね...高さ的に技術書は入らないけどね(哀)

 

さ、私事は置いておいて、プログラミングの大規模開発に初めて携わって1年が経ったわけですが、

qtamaki.hatenablog.com

⇧  上記サイト様によりますと、「人類の7割はプログラミングに向いてない」と...今日も私の心に絶望の嵐が吹き荒れてますが~...

『好きこそ物の上手なれ』とはよく言うけれど、

self-esteem.hatenablog.jp

⇧  上記サイト様によりますと、この地獄から抜け出すには、もう思い込むしかないんだと...いや~、行くも地獄、戻るも地獄ですな。

 

年末年始に、アメリカに住む叔父からの、FacebookのMessenger(無料通話ができるらしい)を使ってのビデオ通話で、『ワシは悟った。一度きりの人生、好きなことをやれ~』みたいなこと言われましたが...

そんな簡単な話じゃねえんだよーーーーーーー!

っていうことを心の中で思いながら、うんうん、ってうなずいてましたが。というか叔父さんは還暦を迎え、隠居生活しとるからね、生活の心配とかないからね。

まぁ、そんなこんなで、世の中は平成も終わろうとしているわけですが、いつまで経ってもプログラミングが好きになれない中、今日もプログラミングを勉強するのであった。

 

というわけで、今回も、Javaに取り組んでいきますか。

f:id:ts0818:20190106145222p:plain

⇧  今回も、こちらのサイトの問題です。

それでは、レッツ~トライ。

 

n×m の行列 A と m×l の行列 Bの積を求めてみる、Java

まぁ、行列は、 

ts0818.hatenablog.com

⇧  この回の記事でも触れたのですが、今回は、演算対象の行列がどちらも複数列バージョンですかね。

問題はこんな感じ。

f:id:ts0818:20190106150849p:plain

 

ソースはこんな感じにしてみました。

package aizu;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class TestMatrixMultipule {

  public static void main(String[] args) throws IOException {
    // TODO 自動生成されたメソッド・スタブ
    BufferedReader input = new BufferedReader(new InputStreamReader(System.in));
    String[] matrixFormat = (input.readLine()).split("\\s");

    int n = Integer.parseInt(matrixFormat[0]); // 行列Aの行
    int m = Integer.parseInt(matrixFormat[1]); // 行列Aの列、行列Bの行
    int l = Integer.parseInt(matrixFormat[2]); // 行列Bの列

    int[][] matrixA = new int[n][m];   // 行列A
    int[][] matrixB = new int[m][l];   // 行列B
    long[][] matrixC = new long[n][l]; // 行列C

    String[] dataMatrixA = null; // 行列Aのデータ用
    for (int i = 0; i < n; i++) {
      dataMatrixA = (input.readLine()).split("\\s"); // 標準入力
      for (int j = 0; j < m; j++) {
        // 行列Aに、データを設定
        matrixA[i][j] = Integer.parseInt(dataMatrixA[j]); 
      }
    }

    String[] dataMatrixB = null; // 行列Bのデータ用
    for (int k = 0; k < m; k++) {
      dataMatrixB = (input.readLine()).split("\\s"); // 標準入力
      for (int h = 0; h < l; h++) {
        // 行列Bに、データを設定
        matrixB[k][h] = Integer.parseInt(dataMatrixB[h]);
      }
    }

    // 行列Aと行列Bの計算
    // 行列Aの行の数だけ繰り返し
    for (int i = 0; i < n; i++) {
      // 行列Aの列、行列Bの行の数だけ繰り返し
      for (int j = 0; j < m; j++) {
        // 行列Bの列の数だけ繰り返し
        for (int k = 0; k < l; k++) {
          // 行列Cに、行列Aと行列Bの積を設定
          matrixC[i][k] += (matrixA[i][j] * matrixB[j][k]);
        }
      }
    }

    // 表示
    // 行列Cの行の数だけ繰り返し
    for (int i = 0; i < n; i++) {
      // 行列Cの列の数だけ繰り返し
      for (int j = 0; j < l; j++) {
        // 最初の要素意外は、半角スペースを付加
        if (j > 0) {
          System.out.print(" ");
        }
        // 行列Cの要素を表示
        System.out.print(matrixC[i][j]);
      }
      // 行の最後で、改行
      System.out.println();
    }
  }
}

で、実行してみると。

f:id:ts0818:20190106162504p:plain

f:id:ts0818:20190106162612p:plain

提出でOKも出ました。

f:id:ts0818:20190106161356p:plain

提出したコードは、こんな感じ。

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
 
public class Main {
 
  public static void main(String[] args) throws IOException {
    // TODO 自動生成されたメソッド・スタブ
    BufferedReader input = new BufferedReader(new InputStreamReader(System.in));
    String[] matrixFormat = (input.readLine()).split("\\s");
 
    int n = Integer.parseInt(matrixFormat[0]);
    int m = Integer.parseInt(matrixFormat[1]);
    int l = Integer.parseInt(matrixFormat[2]);
 
    int[][] matrixA = new int[n][m];
    int[][] matrixB = new int[m][l];
    long[][] matrixC = new long[n][l];
 
    String[] dataMatrixA = null;
    for (int i = 0; i < n; i++) {
      dataMatrixA = (input.readLine()).split("\\s");
      for (int j = 0; j < m; j++) {
        matrixA[i][j] = Integer.parseInt(dataMatrixA[j]);
      }
    }
 
    String[] dataMatrixB = null;
    for (int k = 0; k < m; k++) {
      dataMatrixB = (input.readLine()).split("\\s");
      for (int h = 0; h < l; h++) {
        matrixB[k][h] = Integer.parseInt(dataMatrixB[h]);
      }
    }
 
    for (int i = 0; i < n; i++) {
      for (int j = 0; j < m; j++) {
        for (int k = 0; k < l; k++) {
          matrixC[i][k] += (matrixA[i][j] * matrixB[j][k]);
        }
      }
    }
 
    for (int i = 0; i < n; i++) {
      for (int j = 0; j < l; j++) {
        if (j > 0) {
          System.out.print(" ");
        }
        System.out.print(matrixC[i][j]);
      }
      System.out.println();
    }
  }
}

f:id:ts0818:20190106161412p:plain

相も変わらず、行列についての理解が乏しすぎますが...勉強していかねばですね。 

それにしても、曇り空の日に布団を干すって意味ないですね...

今回はこのへんで。