ในตัวอย่างนี้อินพุตเป็นเมทริกซ์สองขนาดของขนาดใด ๆ m*n, n*m และเอาต์พุตเป็นผลิตภัณฑ์ของเมทริกซ์ทั้งสอง เมื่อคำนวณการคูณของเมทริกซ์ขนาดโดยพลการจะใช้อัลกอริทึม Strassen โปรแกรมเขียนด้วยตนเองและทดสอบโปรดใช้ อัลกอริทึมพื้นฐานคือ:
1. สำหรับเมทริกซ์สแควร์ (เมทริกซ์สี่เหลี่ยม) ค้นหา l ที่ใหญ่ที่สุดเช่น l = 2 ^ k, k เป็นจำนวนเต็มและ l <m อัลกอริทึม Strassen ใช้สำหรับเมทริกซ์สี่เหลี่ยมจัตุรัสที่มีความยาวด้าน L และชิ้นส่วนที่เหลือและชิ้นส่วนที่หายไปในเมทริกซ์สี่เหลี่ยมเป็นแรงเดรัจฉาน
2. สำหรับเมทริกซ์ที่ไม่ใช่กำลังสองให้เพิ่ม 0 ตามแถวและคอลัมน์เพื่อให้เป็นเมทริกซ์สี่เหลี่ยม
strassenmethodtest.java
แพ็คเกจ MatrixAlgorithm; นำเข้า java.util.scanner; ชั้นเรียนสาธารณะ strassenmethodtest {private strassenmethod strassenmultiply; strassenmethodtest () {strassenmultiply = ใหม่ strassenmethod (); } // end cons โมฆะสาธารณะคงที่หลัก (สตริง [] args) {สแกนเนอร์อินพุต = ใหม่สแกนเนอร์ (System.in); System.out.println ("ขนาดแถวอินพุตของเมทริกซ์แรก:"); int emerge = input.nextint (); System.out.println ("ขนาดคอลัมน์อินพุตของเมทริกซ์แรก:"); int acol = input.nextint (); System.out.println ("ขนาดแถวอินพุตของเมทริกซ์ที่สอง:"); int browser = input.nextint (); System.out.println ("ขนาดคอลัมน์อินพุตของเมทริกซ์ที่สอง:"); int bcol = input.nextint (); double [] [] a = new double [arow] [acol]; double [] [] b = ใหม่คู่ [คิ้ว] [BCOL]; double [] [] c = new double [arow] [bcol]; System.out.println ("ข้อมูลอินพุตสำหรับเมทริกซ์ A:"); /*ในรหัสทั้งหมดในภายหลังในโครงการนี้ R หมายถึงแถวในขณะที่ C หมายถึงคอลัมน์ */ สำหรับ (int r = 0; r <arow; r ++) {สำหรับ (int c = 0; c <acol; c ++) {system.out.printf ("ข้อมูลของ [%d] [%d]:", r, c); a [r] [c] = input.nextdouble (); } // สิ้นสุดลูปด้านใน} // end loop system.out.println ("ข้อมูลอินพุตสำหรับเมทริกซ์ B:"); สำหรับ (int r = 0; r <เบราว์เซอร์; r ++) {สำหรับ (int c = 0; c <bcol; c ++) {system.out.printf ("ข้อมูลของ [%d] [%d]:", r, c); b [r] [c] = input.nextdouble (); } // สิ้นสุดลูปด้านใน} // end loop strassenmethodtest อัลกอริทึม = ใหม่ strassenmethodtest (); c = อัลกอริทึม MultiplyRectMatrix (A, B, Come, ACOL, เบราว์เซอร์, BCOL); // แสดงผลการคำนวณ: System.out.println ("ผลลัพธ์จากเมทริกซ์ C:"); สำหรับ (int r = 0; r <arow; r ++) {สำหรับ (int c = 0; c <bcol; c ++) {system.out.printf ("ข้อมูลของ c [%d] [%d]:%f/n", r, c, c [r] [c]); } // สิ้นสุดลูปด้านใน} // สิ้นสุดลูปนอกเวลา} // จบหลัก // จัดการกับเมทริกซ์ที่ไม่ใช่สแควร์: สาธารณะสองเท่า [] [] multiplyRectMatrix (double [] [] a, double [] [] b, int arow, int acol, browser int, int bcol) double [] [] {{0}}; double [] [] c = new double [arow] [bcol]; if (arow <acol) {double [] [] newa = ใหม่ double [acol] [ACOL]; double [] [] newb = ใหม่คู่ [คิ้ว] [คิ้ว]; int n = acol; สำหรับ (int r = 0; r <acol; r ++) สำหรับ (int c = 0; c <acol; c ++) newa [r] [c] = 0.0; สำหรับ (int r = 0; r <เบราว์เซอร์; r ++) สำหรับ (int c = 0; c <เบราว์เซอร์; c ++) newb [r] [c] = 0.0; สำหรับ (int r = 0; r <เบราว์เซอร์; r ++) สำหรับ (int c = 0; c <bcol; c ++) newb [r] [c] = b [r] [c]; double [] [] c2 = multiplysquarematrix (newa, newb, n); สำหรับ (int r = 0; r <arow; r ++) สำหรับ (int c = 0; c <bcol; c ++) c [r] [c] = c2 [r] [c]; } // สิ้นสุดถ้าอื่นถ้า (arow == acol) c = multiplysquarematrix (a, b, วิธี); อื่น {int n = arow; double [] [] newa = new double [arow] [Arow]; double [] [] newb = new double [bcol] [bcol]; สำหรับ (int r = 0; r <arow; r ++) สำหรับ (int c = 0; c <arow; c ++) newa [r] [c] = 0.0; สำหรับ (int r = 0; r <bcol; r ++) สำหรับ (int c = 0; c <bcol; c ++) newb [r] [c] = 0.0; สำหรับ (int r = 0; r <arow; r ++) สำหรับ (int c = 0; c <acol; c ++) newa [r] [c] = a [r] [c]; สำหรับ (int r = 0; r <brow; r ++) สำหรับ (int c = 0; c <bcol; c ++) newb [r] [c] = b [r] [c]; double [] [] c2 = multiplysquarematrix (newa, newb, n); สำหรับ (int r = 0; r <arow; r ++) สำหรับ (int c = 0; c <bcol; c ++) c [r] [c] = c2 [r] [c]; } // สิ้นสุดการส่งคืน C; } // วิธีการสิ้นสุด // จัดการกับเมทริกซ์ที่เป็นเมทริกซ์สี่เหลี่ยม สาธารณะสองเท่า [] [] multiplysquarematrix (double [] [] a2, double [] [] b2, int n) {double [] [] c2 = new double [n] [n]; สำหรับ (int r = 0; r <n; r ++) สำหรับ (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; ในขณะที่ (exp2k <= (n / 2)) {exp2k *= 2; } // end loop ถ้า (exp2k == n) {c2 = strassenmultiply.strassenmultiplyMatrix (a2, b2, n); กลับ C2; } // สิ้นสุดอื่น // matrix strassen "ที่ยิ่งใหญ่ที่สุด": double [] [] [] a = new double [6] [exp2k] [exp2k]; double [] [] [] b = ใหม่สองเท่า [6] [exp2k] [exp2k]; double [] [] [] c = ใหม่สองเท่า [6] [exp2k] [exp2k]; สำหรับ (int r = 0; r <exp2k; r ++) {สำหรับ (int c = 0; c <exp2k; c ++) {a [0] [r] [c] = a2 [r] [c]; b [0] [r] [c] = b2 [r] [c]; } // สิ้นสุดลูปด้านใน} // จบ Outter Loop C [0] = strassenmultiply.strassenmultiplymatrix (a [0], b [0], exp2k); สำหรับ (int r = 0; r <exp2k; r ++) สำหรับ (int c = 0; c <exp2k; c ++) c2 [r] [c] = c [0] [r] [c]; int middle = exp2k / 2; สำหรับ (int r = 0; r <middle; r ++) {สำหรับ (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 ++) {สำหรับ (int c = 0; c <middle; c ++) {a [3] [r - exp2k] [c] = a2 [r] [c]; b [1] [r - exp2k] [c] = b2 [r] [c]; } // end loop ภายใน} // end outter loop สำหรับ (int r = middle; r <exp2k; r ++) {สำหรับ (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 ++) {สำหรับ (int c = กลาง; c <n - exp2k+1; c ++) {a [4] [r - exp2k] [c - middle] = a2 [r] [c]; b [2] [r - exp2k] [c - middle] = b2 [r] [c]; } // สิ้นสุดลูปด้านใน} // สิ้นสุดลูปนอกสำหรับ (int i = 1; i <= 4; i ++) c [i] = multiplyRectMatrix (a [i], b [i], กลาง, [i]. length, a [i]. length, กลาง); / * คำนวณผลลัพธ์สุดท้ายของกริดใน "สี่เหลี่ยมที่ใหญ่ที่สุด 2^K ตามกฎของการคูณเมทริกซ์ */ สำหรับ (int แถว = 0; แถว <exp2k; แถว ++) {สำหรับ (int col = 0; col <exp2k; col ++) {สำหรับ (int k = exp2k; k <n; } // end loop} // end loop ใน} // end out loop // ใช้กำลังดุร้ายเพื่อแก้ปัญหาส่วนที่เหลือจะได้รับการปรับปรุงในภายหลัง: สำหรับ (int col = exp2k; col <n; col ++) {สำหรับ (int แถว = 0; แถว <n; แถว ++) {สำหรับ (int k = 0; b2 [k] [แถว]; } // end outter loop return c2;} // method end} // end class strassenmethod.java
แพ็คเกจ MatrixAlgorithm; นำเข้า java.util.scanner; ชั้นเรียนสาธารณะ strassenmethod {private double [] [] [] [] a = ใหม่สองเท่า [2] [2] [] []; ส่วนตัวสองเท่า [] [] [] [] b = ใหม่คู่ [2] [2] []; ส่วนตัวสองเท่า [] [] [] [] c = ใหม่สองเท่า [2] [2] []; /*// รหัสสำหรับการทดสอบคลาสนี้: โมฆะคงที่สาธารณะหลัก (สตริง [] args) {สแกนเนอร์อินพุต = สแกนเนอร์ใหม่ (System.in); System.out.println ("ขนาดอินพุตของเมทริกซ์:"); int n = input.nextint (); double [] [] a = new double [n] [n]; double [] [] b = ใหม่ double [n] [n]; double [] [] c = new double [n] [n]; System.out.println ("ข้อมูลอินพุตสำหรับเมทริกซ์ A:"); สำหรับ (int r = 0; r <n; r ++) {สำหรับ (int c = 0; c <n; c ++) {system.out.printf ("ข้อมูลของ [%d] [%d]:", r, c); a [r] [c] = input.nextdouble (); } // สิ้นสุดลูปด้านใน} // end loop system.out.println ("ข้อมูลอินพุตสำหรับเมทริกซ์ B:"); สำหรับ (int r = 0; r <n; r ++) {สำหรับ (int c = 0; c <n; c ++) {system.out.printf ("ข้อมูลของ [%d] [%d]:", r, c); b [r] [c] = input.nextdouble (); } // สิ้นสุดลูปด้านใน} // อัลกอริทึม strassenmethod end strassenmethod = new Strassenmethod (); c = อัลกอริทึม. strassenmultiplymatrix (a, b, n); System.out.println ("ผลลัพธ์จากเมทริกซ์ C:"); สำหรับ (int r = 0; r <n; r ++) {สำหรับ (int c = 0; c <n; c ++) {system.out.printf ("ข้อมูลของ c [%d] [%d]:%f/n", r, c, c [r] [c]); } // สิ้นสุดลูปด้านใน} // สิ้นสุดลูปนอก} // สิ้นสุดหลัก*/สาธารณะสองเท่า [] [] strassenmultiplyMatrix (double [] [] a2, double b2 [] [], int n) {double [] [] c2 = คู่ใหม่ [n] [n]; // เริ่มต้นเมทริกซ์: สำหรับ (int rowindex = 0; rowindex <n; rowindex ++) สำหรับ (int colindex = 0; colindex <n; colindex ++) c2 [rowindex] [colindex] = 0.0; ถ้า (n == 1) c2 [0] [0] = a2 [0] [0] * b2 [0] [0]; // "เมทริกซ์ชิ้นเป็น 2 * 2 ส่วน: อื่น {double [] [] [] [] a = ใหม่สองเท่า [2] [2] [n / 2] [n / 2]; double [] [] [] [] [] [] b = ใหม่คู่ [2] [2] [n / 2] [n / 2]; r <n / 2; A [1] [1] [R] [C] = A2 [N / 2 + R] [N / 2 + C]; B [1] [1] [R] [C] = B2 [N/2 + R] [N/2 + C]; Addmatrix (A [0] [0], A [0] [1], N); S [5] = Addmatrix (B [0] [0], B [1] [1], N); A [1] [0], N); B [1] [1], N); StrassenmultiplyMatrix (S [6], S [7], N); = Addmatrix (P [0], P [1], N); n / 2; R] [C] = C [1] [0] [R] [C]; C2 [N/2 + R] [N/2 + C] = C [1] [1] [] [] b, int n) {double c [] [] = new double [n] [n]; minusmatrix (double [] [] a, double [] [] b, int n) {double c [] [] = ใหม่สองเท่า [n] [n];ฉันหวังว่าบทความนี้จะเป็นประโยชน์กับทุกคนในการเรียนรู้การเขียนโปรแกรม Java