いや~、今日も人生について考えることしきりです、どうもボクです。年末年始の帰省で将来的に実家を売り払うという話が出て、帰る故郷が無くなることを知り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(); } } }
相も変わらず、行列についての理解が乏しすぎますが...勉強していかねばですね。
それにしても、曇り空の日に布団を干すって意味ないですね...
今回はこのへんで。