いや~、今日も人生について考えることしきりです、どうもボクです。年末年始の帰省で将来的に実家を売り払うという話が出て、帰る故郷が無くなることを知り2019年も暗黒面に沈みそうな心持ちの我輩ではありますが、みなさんいかがお過ごしでしょうか。
あまりの衝撃に、東京のアパートに戻ってきてから、Amazonで本棚を衝動買いしてしまった次第です。

山善 本棚 コミック収納ラック 4段 幅60×奥行17×高さ89cm 耐荷重50kg ホワイト CMCR-9060(WH)
⇧ これで、床に平積みしていた本が片付くかしらね...高さ的に技術書は入らないけどね(哀)
さ、私事は置いておいて、プログラミングの大規模開発に初めて携わって1年が経ったわけですが、
⇧ 上記サイト様によりますと、「人類の7割はプログラミングに向いてない」と...今日も私の心に絶望の嵐が吹き荒れてますが~...
『好きこそ物の上手なれ』とはよく言うけれど、
⇧ 上記サイト様によりますと、この地獄から抜け出すには、もう思い込むしかないんだと...いや~、行くも地獄、戻るも地獄ですな。
年末年始に、アメリカに住む叔父からの、FacebookのMessenger(無料通話ができるらしい)を使ってのビデオ通話で、『ワシは悟った。一度きりの人生、好きなことをやれ~』みたいなこと言われましたが...
『そんな簡単な話じゃねえんだよーーーーーーー!』
っていうことを心の中で思いながら、うんうん、ってうなずいてましたが。というか叔父さんは還暦を迎え、隠居生活しとるからね、生活の心配とかないからね。
まぁ、そんなこんなで、世の中は平成も終わろうとしているわけですが、いつまで経ってもプログラミングが好きになれない中、今日もプログラミングを勉強するのであった。
というわけで、今回も、Javaに取り組んでいきますか。

⇧ 今回も、こちらのサイトの問題です。
それでは、レッツ~トライ。
n×m の行列 A と m×l の行列 Bの積を求めてみる、Javaで
まぁ、行列は、
⇧ この回の記事でも触れたのですが、今回は、演算対象の行列がどちらも複数列バージョンですかね。
問題はこんな感じ。

ソースはこんな感じにしてみました。
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();
}
}
}
で、実行してみると。


提出でOKも出ました。

提出したコードは、こんな感じ。
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();
}
}
}

相も変わらず、行列についての理解が乏しすぎますが...勉強していかねばですね。
それにしても、曇り空の日に布団を干すって意味ないですね...
今回はこのへんで。