この例では、入力は任意のサイズm*n、n*mの2つの行列であり、出力は2つのマトリックスの積です。任意のサイズマトリックスの乗算を計算するとき、Strassenアルゴリズムが使用されます。プログラムは自己執筆およびテストされています。お気軽にご利用ください。基本的なアルゴリズムは次のとおりです。
1。平方マトリックス(正方行列)の場合、l = 2 ^ k、kが整数であり、l <mである最大Lを見つけます。 Strassenアルゴリズムは、側面長lの正方行列に使用され、四角マトリックスの残りの部分と欠落した部分は青ビルです。
2。非二乗マトリックスの場合、行と列に従って0を追加して、正方行列にします。
strassenmethodtest.java
パッケージmatrixalgorithm; Java.util.scannerをインポートします。 Public Class Strassenmethodtest {private strassenmethod strassenmultiply; strassenmethodtest(){strassenmultiply = new strassenmethod(); } // end cons public static void main(string [] args){scanner input = new scanner(system.in); System.out.println( "最初のマトリックスの入力行サイズ:"); int emerge = input.nextint(); System.out.println( "最初のマトリックスの入力列サイズ:"); int acol = input.nextint(); System.out.println( "2番目のマトリックスの入力行サイズ:"); int browser = input.nextint(); System.out.println( "2番目のマトリックスの入力列サイズ:"); int bcol = input.nextint(); double [] [] a = new double [arow] [acol]; double [] [] b = new double [brow] [bcol]; double [] [] c = new double [arow] [bcol]; System.out.println( "マトリックスAの入力データ:"); /*このプロジェクトの後半のすべてのコードでは、rは行を意味し、cは列を意味します。 */(int r = 0; r <arow; r ++){for(int c = 0; c <acol; c ++){system.out.printf( "データのデータ[%d] [%d]:"、r、c); a [r] [c] = input.nextdouble(); } //内側ループを終了} // end loop system.out.println( "マトリックスBの入力データ:"); for(int r = 0; r <browser; r ++){for(int c = 0; c <bcol; c ++){system.out.printf( "データのデータ[%d] [%d]:"、r、c); b [r] [c] = input.nextdouble(); } //内側ループを終了} // end loop strassenmethodtest algorithm = new Strassenmethodtest(); c = algorithm.multiplyrectmatrix(a、b、come、acol、browser、bcol); //計算結果を表示:System.out.println( "マトリックスCからの結果:"); for(int r = 0; r <arow; r ++){for(int c = 0; c <bcol; c ++){system.out.printf( "c [%d] [%d]:%f/n"、r、c、c [r] [c]); } //内側のループ} //終了Outter loop} // End Main //正方形ではない行列を扱う:public Double [] [] [Double [] [] b、int arow、int acol、int browser、int bcol){if(arow!= bcol) double [] [] {{0}}; double [] [] c = new double [arow] [bcol]; if(arow <acol){double [] [] newa = new double [acol] [acol]; double [] [] newb = new double [brow] [brow]; int n = acol; for(int r = 0; r <acol; r ++)for(int c = 0; c <acol; c ++)newa [r] [c] = 0.0; for(int r = 0; r <browser; r ++)for(int c = 0; c <browser; c ++)newb [r] [c] = 0.0; for(int r = 0; r <browser; r ++)for(int c = 0; c <bcol; c ++)newb [r] [c] = b [r] [c]; double [] [] c2 = Multiplysquarematrix(Newa、Newb、n); for(int r = 0; r <arow; r ++)for(int c = 0; c <bcol; c ++)c [r] [c] = c2 [r] [c]; } // end if else if(arow == acol)c = multiplysquarematrix(a、b、approach); else {int n = arow; double [] [] newa = new double [arow] [arow]; double [] [] newb = new double [bcol] [bcol]; for(int r = 0; r <arow; r ++)for(int c = 0; c <arow; c ++)newa [r] [c] = 0.0; for(int r = 0; r <bcol; r ++)for(int c = 0; c <bcol; c ++)newb [r] [c] = 0.0; for(int r = 0; r <arow; r ++)for(int c = 0; c <acol; c ++)newa [r] = a [r] [c]; for(int r = 0; r <brow; r ++)for(int c = 0; c <bcol; c ++)newb [r] [c] = b [r] [c]; double [] [] c2 = Multiplysquarematrix(Newa、Newb、n); for(int r = 0; r <arow; r ++)for(int c = 0; c <bcol; c ++)c [r] [c] = c2 [r] [c]; } // end else return c; } //終了方法//正方行列であるマトリックスを扱います。 public double [] [] MultiplySquareMatrix(double [] [] a2、double [] [] b2、int n){double [] [] c2 = new double [n] [n]; for(int r = 0; r <n; r ++)for(int c = 0; c <n; c ++)c2 [r] [c] = 0; if(n == 1){c2 [0] [0] = a2 [0] [0] * b2 [0] [0]; C2を返します。 } // int exp2k = 2の場合は終了します。 while(exp2k <=(n / 2)){exp2k *= 2; } // end loop if(exp2k == n){c2 = strassenmultiply.strassenmultiplymatrix(a2、b2、n); C2を返します。 } // end else //「最大の」strassenマトリックス:double [] [] [] a = new double [6] [exp2k] [exp2k]; double [] [] [] b = new double [6] [exp2k] [exp2k]; double [] [] [] c = new double [6] [exp2k] [exp2k]; for(int r = 0; r <exp2k; r ++){for(int c = 0; c <exp2k; c ++){a [0] [r] [c] = a2 [r] [c]; b [0] [r] [c] = b2 [r] [c]; } //内側ループを終了} //外部ループc [0] = strassenmultiply.strassenmultiplymatrix(a [0]、b [0]、exp2k); for(int r = 0; r <exp2k; r ++)for(int c = 0; c <exp2k; c ++)c2 [r] [c] = c [0] [r] [c]; int middle = exp2k / 2; for(int r = 0; r <middle; r ++){for(int c = exp2k; c <n; c ++){a [1] [r] [c -exp2k] = a2 [r] [c]; b [3] [r] [c -exp2k] = b2 [r] [c]; } //内側ループの終了} //(int r = exp2k; r <n; r ++){for(int c = 0; c <middle; c ++){a [3] [r -exp2k] [c] = a2 [r] [c]; b [1] [r -exp2k] [c] = b2 [r] [c]; } //内側ループ} //(int r = middle; r <exp2k; r ++){for(int c = exp2k; c <n; c ++){a [2] [r -middle] [c -exp2k] = a2 [r] [c]; b [4] [r -middle] [c -exp2k] = b2 [r] [c]; } //内側ループ} //(int r = exp2k; r <n; r ++){for(int c = middle; c <n -exp2k+1; c ++){a [4] [r -exp2k] [c -middle] = a2 [r] [c]; b [2] [r -exp2k] [c-中央] = b2 [r] [c]; } //内側ループ} //(int i = 1; i <= 4; i ++)c [i] = multipLirectmatrix(a [i]、b [i]、middle、a [i]。length、a [i]。length、middle); / *マトリックス乗算の規則に従って、「最大2^kスクエアのグリッドの最終結果を計算します。 b2 [k] [col]; a2 [low] [k] * b2 [k] [row]; } //内側ループの終了} // end outter loop return c2 ;/ end method} // endクラスstrassenmethod.java
パッケージmatrixalgorithm; Java.util.scannerをインポートします。 public class strassenmethod {private double [] [] [] [] a = new double [2] [2] [] [];プライベートダブル[] [] [] [] [] b = new double [2] [2] [];プライベートダブル[] [] [] [] [] c = new double [2] [2] []; /*//このクラスをテストするためのコード:public static void main(string [] args){scanner input = new scanner(system.in); system.out.println( "マトリックスの入力サイズ:"); int n = input.nextint(); double [] [] a = new double [n] [n]; double [] [] b = new double [n] [n]; double [] [] c = new double [n] [n]; System.out.println( "マトリックスAの入力データ:"); for(int r = 0; r <n; r ++){for(int c = 0; c <n; c ++){system.out.printf( "データのデータ[%d]:"、r、c); a [r] [c] = input.nextdouble(); } //内側ループを終了} // end loop system.out.println( "マトリックスBの入力データ:"); for(int r = 0; r <n; r ++){for(int c = 0; c <n; c ++){system.out.printf( "データのデータ[%d]:"、r、c); b [r] [c] = input.nextdouble(); } //内側ループを終了} // end loop strassenmethod algorithm = new Strassenmethod(); c = algorithM.StrassenMultiplyMatrix(a、b、n); system.out.println( "マトリックスC:"の結果: "); for(int r = 0; r <n; r ++){for(int c = 0; c <n; c ++){system.out.printf( "データのデータ[%d] [%d]:%f/n"、r、c、c [r] [c]); } //内側のループ} //終了外部ループ} // end main*/public double [] [] strassenmultiplymatrix(double [] [] a2、double b2 [] []、int n){double [] [] c2 = new double [n] [n]; //マトリックスの初期化:for(int rowindex = 0; rowindex <n; rowindex ++)for(int colindex = 0; colindex <n; colindex ++)c2 [rowindex] [colindex] = 0.0; if(n == 1)c2 [0] [0] = a2 [0] [0] * b2 [0] [0]; // "スライスマトリックスは2 * 2パートにスライスします:else {double [] [] [] [] a = new double [2] [2] [n / 2] [n / 2]; double [] [] [] [] [] [] [] [] [2] [2] [n / 2] [n / 2]; double [] [] [] [N / 0; r <n / 2; b [0] [0] [c] = b2 [c] [r] [r] [n / 2 + c] = b2 [n / 2 + r] [c]; } // end n = n/2; A [1]、n); minusmatrix(a [1] [1]、s [7]; double [] [] p = new [7] [n] = strassenmultiplymatrix(s [0]、n) n); strassenmultiplymatrix(a [3]、n); S [9]、c [0] [0] = minusmatrix(p [4]、p [3]、n)、p [1)、p [5]、n)[1]; c [1] [1] = minusmatrix(minusmatrix(p [4]、p [0]、p [2]、n)、p [6]、n *= 2; c [0] [r] [r] [n / 2 + c] = c2 [n / 2 + r] [c] [1] [r] [c]; c [1] [r] [c]; n; for(int r <n; r ++)この記事がJavaプログラミングを学ぶのに役立つことを願っています。