في هذا المثال ، فإن الإدخال عبارة عن مصفوفين من أي حجم m*n ، n*m ، والمخرج هو ناتج اثنين من المصفوفات. عند حساب مضاعفة مصفوفات الحجم التعسفي ، يتم استخدام خوارزمية Strassen. البرنامج مكتوب ذاتيا واختباره ، لا تتردد في استخدامه. الخوارزمية الأساسية هي:
1. للمصفوفة المربعة (المصفوفة المربعة) ، ابحث عن أكبر L ، بحيث l = 2 ^ k ، k هو عدد صحيح و l <m. تستخدم المصفوفة المربعة ذات الطول الجانبي L خوارزمية Strassen ، والباقي والأجزاء المفقودة من المصفوفة المربعة تستخدم طريقة القوة الغاشمة.
2. لمصفوفة غير مربعة ، أضف 0 وفقًا للصف والعمود لجعله مصفوفة مربعة.
Strassenmethodtest.java
حزمة Matrixalgorithm ؛ استيراد java.util.scanner ؛ الطبقة العامة 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 exerge = 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 = New Double [Brow] [BCOL] ؛ Double [] [] C = New Double [AROW] [BCOL] ؛ System.out.println ("بيانات الإدخال للمصفوفة A:") ؛ /*في جميع الرموز في وقت لاحق من هذا المشروع ، تعني r الصف بينما C يعني العمود. */ for (int r = 0 ؛ r <arow ؛ r ++) {for (int c = 0 ؛ c <acol ؛ c ++) {system.out.printf ("بيانات A [٪ d] [٪ d]:" ، r ، c) ؛ a [r] [c] = input.nextDouble () ؛ } // end inner loop} // end loop system.out.println ("بيانات الإدخال للمصفوفة B:") ؛ لـ (int r = 0 ؛ r <browser ؛ r ++) {for (int c = 0 ؛ c <bcol ؛ c ++) {system.out.printf ("بيانات A [٪ d] [٪ d]:" ، r ، c) ؛ b [r] [c] = input.nextDouble () ؛ } // end inner loop} // end loop strassenmethodtest regorithm = new StrassenMethodTest () ؛ C = GALGORITHM.MultiPlyRectMatrix (A ، B ، Come ، Acol ، Browser ، BCOL) ؛ // عرض نتيجة الحساب: system.out.println ("النتيجة من المصفوفة C:") ؛ لـ (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]) ؛ }. 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 ؛ لـ (int r = 0 ؛ r <acol ؛ r ++) لـ (int c = 0 ؛ c <acol ؛ c ++) newa [r] [c] = 0.0 ؛ لـ (int r = 0 ؛ r <browser ؛ r ++) لـ (int c = 0 ؛ c <browser ؛ c ++) newb [r] [c] = 0.0 ؛ لـ (int r = 0 ؛ r <browser ؛ 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] ؛ } // end if else if (arow == acol) c = multiplysquarematrix (a ، b ، approach) ؛ آخر {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] ؛ } // end آخر مرة أخرى c ؛ } // end method // التعامل مع المصفوفات التي هي مصفوفات مربعة. public double [] [] 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 ؛ } // end if int exp2k = 2 ؛ بينما (exp2k <= (n / 2)) {exp2k *= 2 ؛ } // end loop if (exp2k == n) {c2 = strassenmultiply.strassenmultiplymatrix (a2 ، b2 ، n) ؛ إرجاع C2 ؛ } // end آخر // "أكبر" مصفوفة Strassen: double [] [] [] a = new double [6] [exp2k] [exp2k] ؛ Double [] [] [] B = New Double [6] [Exp2K] [Exp2K] ؛ Double [] [] [] C = New Double [6] [Exp2K] [Exp2K] ؛ لـ (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] ؛ } // end inner loop} // end untter 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 ++) {for (int c = exp2k ؛ c <n ؛ c ++) {a [1] [r] [c - exp2k] = a2 [r] [c] ؛ B [3] [r] [c - exp2k] = b2 [r] [c] ؛ } // end inner loop} // end untter loop لـ (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] ؛ } // end inner loop} // end untter loop لـ (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] ؛ } // end inner loop} // end untter loop لـ (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 - middle] = b2 [r] [c] ؛ } // end inner loop} // end ext extter loop لـ (int i = 1 ؛ i <= 4 ؛ i ++) c [i] = multiplyRectMatrix (a [i] ، b [i] ، middle ، a [i] .length ، a [i] .length ، middle) ؛ / * احسب النتائج النهائية للشبكات في "أكبر 2^k مربع ، وفقًا لقواعد مضاعفة المصفوفة. */ لـ (int row = 0 ؛ row <exp2k ؛ row ++) {for (int col = 0 ؛ col <exp2k ؛ col ++) {for (int k = exp2k ؛ k <n ؛ k ++) {c2 [row] }. B2 [K] [ROW] ؛ } // end extring loop return c2 ؛ Strassenmethod.java
حزمة Matrixalgorithm ؛ استيراد java.util.scanner ؛ الطبقة العامة strassenmethod {private double [] [] [] A = New Double [2] [2] [] [] ؛ مزدوج خاص [] [] [] [] B = New Double [2] [2] [] ؛ مزدوج خاص [] [] [] [] C = مزدوج جديد [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:") ؛ لـ (int r = 0 ؛ r <n ؛ r ++) {for (int c = 0 ؛ c <n ؛ c ++) {system.out.printf ("بيانات [٪ d] [٪ d]:" ، r ، c) ؛ a [r] [c] = input.nextDouble () ؛ } // end inner loop} // end loop system.out.println ("بيانات الإدخال للمصفوفة B:") ؛ لـ (int r = 0 ؛ r <n ؛ r ++) {for (int c = 0 ؛ c <n ؛ c ++) {system.out.printf ("بيانات [٪ d] [٪ d]:" ، r ، c) ؛ b [r] [c] = input.nextDouble () ؛ } // end inner loop} // end loop strassenmethod gensm = new StrassenMethod () ؛ C = GALGORITHM.STRASSENMULTIPLYMATRIX (A ، B ، N) ؛ System.out.println ("نتيجة من المصفوفة C:") ؛ لـ (int r = 0 ؛ r <n ؛ r ++) {for (int c = 0 ؛ c <n ؛ c ++) {system.out.printf ("بيانات c [٪ d] [٪ d]: ٪ f/n" ، r ، c ، c [r] [c]) ؛ } // end inner loop} // end untter loop} // end main*/public double [] [] strassenmultiplymatrix (double [] [] a2 ، double b2 [] ، int n) {double [] [] c2 = new double [n] [n] ؛ // تهيئة المصفوفة: لـ (int rowindex = 0 ؛ rowindex <n ؛ rowindex ++) لـ (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 الأجزاء: {{double [] [] [] [] A = New Double [2] [2] [n / 2] [n / 2] ؛ double [] [] [] [] b = new double [2] [n / 2] [n / 2] r <n / 2 ؛ B [0] [0] [R] [C] = B2 [C] ؛ }/end loop n = n/2 ؛ A [1] ، N) ؛ A [1] [1] ، n) ؛ [7] [n] [n] ؛ strassenmultiplymatrix (a [1] ، s [3] ، n) ؛ C [0] [0] = AddMatrix (MinusMatrix (P [4] ، p [3] ، n) ، n) ، p [5] ، n) ؛ MinusMatrix (minusmatrix (phadmatrix (p [4] ، p [0] ، n) ، p [2] ، p [6] ، n) ؛ C2 [R] [N / 2 + C] = C [0] [R] [C] ؛ inner loop} // end ext exply} end else c2 ؛ C ++) c [r] [c] = a [c]+b [r] [c] ؛ = 0 ؛آمل أن يكون هذا المقال مفيدًا للجميع لتعلم برمجة Java.