Cách nhân 2 ma trận vuông cấp 3

  -  

Ma trận với các phxay toán liên quan tới nó là một phần khôn xiết quan trọng vào phần lớn mọi thuật tân oán tương quan mang lại số học tập.

Bạn đang xem: Cách nhân 2 ma trận vuông cấp 3

You watching: Cách nhân 2 ma trận vuông cấp 3

Tại bài bác trước, họ tất cả đề cùa tới Việc ứng dụng phép nhân ma trận để tính số Fibonacci một bí quyết công dụng. Vậy thuật tân oán nhân ma trận cơ mà bọn họ thực hiện làm việc vào nội dung bài viết vẫn đích thực tác dụng tốt chưa?

Trong quy trình tò mò nhằm viết bài này thì mình vạc hiện ra một điều hơi là thú vui, đó là có khá nhiều thuật toán để thực hiện nhân ma trận, tuy vậy ngành khoa học máy tính vẫn chưa đưa ra được câu trả lời mang đến câu hỏi: Đâu là thuật toán thù tối ưu nhằm triển khai phép nhân ma trận?

Định nghĩa phép Nhân ma trận

Nhắc lại một ít kỹ năng toán thù học về cách thức nhân 2 ma trận $A$ với $B$, điều kiện đầu tiên để hoàn toàn có thể triển khai phnghiền nhân này là Lúc số cột của ma trận $A$ thông qua số sản phẩm của ma trận $B$.

Với $A$ là một trong ma trận tất cả size $n imes m$ cùng $B$ là một trong những ma trận kích cỡ $m imes p$ thì tích của $A imes B$ đã là 1 trong ma trận $n imes p$ được xem bằng phương pháp sau:

$$left( eginarrayccca & b \c & d endarray ight) imesleft( eginarraycccx \yendarray ight)=left( eginarraycccax + by \cx + dyendarray ight)$$Hình sau mô tả cách tính một phần tử AB của ma trận tích:


*

Một thành phần là tổng của phép nhân những phần tử vào một hàng của ma trận $A$ với các bộ phận vào cột tương xứng vào ma trận $B$

$$_i,j = A_i,1B_1,j + A_i,2B_2,j + ldots + A_i,nB_n,j$$Hay viết mang lại gọn hơn hoàn toàn như là sau:

$$_i,j = displaystylesum_r=1^n A_i,rB_r,j$$Noob Question: Cái vệt hình zích zắc $sum$ tê là gì vậy???

Chửi trước: Ôi ttách, đây là loại vết tính tổng mà lại cũng lừng chừng à? Về học tập lại tân oán cung cấp 3 giỏi năm duy nhất ĐH gì đấy đi nhé! Tốn thời hạn bm!!Đáp sau: Cái vết zích zắc chính là kí hiệu phxay tính tổng, có thể tưởng tượng kí hiệu này y như một vòng lặp for trong triển khai phnghiền tính cùng, số $n$ sinh hoạt bên trên đỉnh chỉ tổng mốc giới hạn lặp quan trọng, số $r = 1$ làm việc bên dưới cho ta biết giá trị làm sao đề nghị chạy trong tầm lặp for và ban đầu chạy từ cực hiếm từng nào. Biểu thức kèm theo sau kí hiệu $sum$ mang đến ta biết phnghiền cùng những cực hiếm nào sẽ tiến hành triển khai bên trong vòng lặp kia.Tiếp theo, hãy cùng xem họ gồm các cách nào nhằm implement thuật toán thù này bên trên máy tính.

The naive algorithm

Naive Algorithm là từ dùng để làm duy nhất thuật toán đơn giản và dễ dàng độc nhất được suy luận một cách "ngây thơ" bằng phương pháp cách xử trí thông thường, ví như search kiếm tuần từ bỏ (sequential/linear search)

Trong trường đúng theo này, họ hay implement thuật toán thù nhân ma trận bằng cách áp dụng chính xác bí quyết trường đoản cú định nghĩa toán học của chính nó, thực hiện vòng lặp, nhỏng sau:

Input: Hai ma trận A size $n imes m$ và B kích cỡ $m imes p$

1: Khởi tạo thành ma trận C có kích thước $n imes p$ 2: For i từ bỏ $1 ightarrow n$:3: For j từ bỏ $1 ightarrow p$:4: Gán $sum = 0$5: For r từ $1 ightarrow m$:6: Gán $sum = sum + A_i,r imes B_r,j$7: Gán $C_i,j = sum$

Output: Ma trận C kích cỡ $n imes p$

Tại sao lại Gọi là naive algorithm (ngây thơ)? kia bởi vì nó rất đơn giản implement, chỉ việc theo lối lưu ý đến thông thường, bỏ lỡ không còn đầy đủ nhân tố như độ tinh vi, sự buổi tối ưu...

Độ tinh vi của thuật tân oán bên trên là $mathcalO(nmp)$, trong ngôi trường vừa lòng toàn bộ các ma trận những là ma trận vuông $n imes n$ thì độ phức hợp của thuật toán sẽ là $mathcalO(n^3)$

Chia để trị - Thuật tân oán Strassen

Vào năm 1969, Volker Strassen - cơ hội kia đang là sinch viên trên MIT - nhận định rằng $mathcalO(n^3)$ không phải là con số về tối ưu chất nhận được nhân ma trận, và lời khuyên một thuật tân oán mới bao gồm thời hạn chạy chỉ nkhô giòn rộng một ít cơ mà sau đây đã kéo theo rất nhiều công ty công nghệ dấn thân liên tiếp nghiên cứu và phân tích với cho tới thời khắc hiện thời, đã có nhiều phương pháp mới được chỉ dẫn như thể thuật toán Coppersmith-Winograd (đang nói tại phần sau), hoặc các chiến thuật tiếp cận bằng lập trình sẵn tuy nhiên tuy vậy bên trên những lắp thêm tính/các core,... Điểm thú vui là Strassen nghĩ ra thuật toán thù này bởi vì nó là bài xích tập trong một tờ mà ông sẽ học .

Xét lại thuật toán thù naive sầu ở vị trí trước, nhằm tính 1 phần tử $C_i,j$ của ma trận tích $C$, ta bắt buộc triển khai hai phép nhân và một phxay cùng. Suy ra ví như $C$ là 1 trong những ma trận vuông có size $2 imes 2$, thì để tính bốn phần tử của $C$, đòi hỏi phải triển khai $2 imes 2^2 = 2^3 = 8$ phép nhân cùng $(2 - 1) imes 2^2 = 4$ phnghiền cùng. Nếu $A$ cùng $B$ là phần lớn ma trận cấp cho $n$ (Có nghĩa là những ma trận $n imes n$) thì chúng ta cần được triển khai $n^3$ phép nhân với $(n - 1) imes n^2$ phnghiền cộng.

Xem thêm: Những Cách Thay Đổi Bản Thân Nhanh Nhất, Kỹ Năng Thay Đổi Bản Thân

Ý tưởng thuật toán của Strassen là vận dụng phân tách nhằm trị nhằm giải quyết bài bác toán theo vị trí hướng của giải mã cơ phiên bản bên trên. Cụ thể là: với mỗi ma trận vuông A, B, C bao gồm kích thước $n imes n$, họ phân tách bọn chúng thành 4 ma trận con, với màn biểu diễn tích $A imes B = C$ theo các ma trận nhỏ đó:


*

Trong đó:

$$eginalignC_1,1 và = A_1,1B_1,1 + A_1,2B_2,1 \C_1,2 & = A_1,1B_1,2 + A_1,2B_2,2 \C_2,1 & = A_2,1B_1,1 + A_2,2B_2,1 \C_2,2 và = A_2,1B_1,2 + A_2,2B_2,2 endalign$$Tuy nhiên cùng với giải pháp phân tích này thì chúng ta vẫn yêu cầu 8 phxay nhân để tính ra ma trận $C$. Đây là phần quan trọng đặc biệt nhất của vấn đề.See more: 10/10 Là Ngày 10 Tháng 10 Là Ngày Gì ? Ngày 10/10 Là Ngày Gì

Chúng ta có mang ra những ma trận $M$ bắt đầu như sau:

$$eginalignM_1 và = (A_1,1 + A_2,2)(B_1,1 + B_2,2) \M_2 và = (A_2,1 + A_2,2) B_1,1 \M_3 và = A_1,1 (B_1,2 - B_2,2) \M_4 và = A_2,2 (B_2,1 - B_1,1) \M_5 và = (A_1,1 + A_1,2) B_2,2 \M_6 & = (A_2,1 - A_1,1)(B_1,1 + B_1,2) \M_7 và = (A_1,2 - A_2,2)(B_2,1 + B_2,2)endalign$$Và màn biểu diễn lại những bộ phận của $C$ theo $M$ nhỏng sau:

$$eginalignC_1,1 và = M_1 + M_4 - M_5 + M_7 \C_1,2 & = M_3 + M_5 \ C_2,1 & = M_2 + M_4 \C_2,2 & = M_1 - M_2 + M_3 + M_6endalign$$Bằng phương pháp này, chúng ta chỉ việc 7 phép nhân (từng $M$ một phnghiền nhân) vắt do 8 như cách thức cũ.

Thực hiện nay đệ quy quy trình trên cho đến Lúc ma trận gồm trung học phổ thông.

Độ phức hợp của thuật toán Strassen là $mathcalO(n^log7) approx mathcalO(n^2.807)$

Đồ thị sau đối chiếu sự khác biệt về độ phức hợp của nhì thuật toán thù vừa bàn:


*

Coppersmith-Winograd Algorithm và những thuật tân oán cải tiến

Dựa trên phát minh của Strassen, trong tháng 5/1987, nhì công ty kỹ thuật Don Coppersmith với Shmuel Winograd chào làng bài bác báo Matrix Multiplication via Arithmetic Progression trình làng một phương thức new nhằm tăng vận tốc nhân ma trận và cho biết độ phức tạp của thuật toán thù mà họ phát triển là $mathcalO(n^2.376)$ với được Review là thuật tân oán nhân ma trận nhanh hao độc nhất vô nhị tính tới thời điểm này.


*

Vào tháng 3/2013, A. M. Davie cùng A. J. Stothers ra mắt bài xích báo Improved bound for complexity of matrix multiplication và cho biết thêm chúng ta đặt được con số $mathcalO(n^2.37369)$ lúc cải tiến với khảo sát thuật tân oán của Coppersmith-Winograd.

Tháng 1/năm trước, François Le Gall chào làng bài bác báo Powers of Tensors và Fast Matrix Multiplication tiếp tục đối chiếu thuật toán thù của nhì bên kỹ thuật này và có được con số $mathcalO(n^2.3728639)$.

Vào mon 7/2014, Virginia Vassilevska Williams thuộc đại học Standford công bố bài bác báo Multiplying matrices in $mathcalO(n^2.373)$ time đưa ra phương pháp cải tiến thuật tân oán của Coppersmith-Winograd và ra mắt độ phức tạp là $mathcalO(n^2.372873)$.

Xem thêm: Làm Cách Chặn Các Nhóm Trên Facebook Đơn Giản, Cách Chặn Các Nhóm Trên Facebook

Kết luận

Tổng kết lại, với các thuật toán hiện thời, chúng ta đúc rút được bảng so sánh về độ phức hợp như sau:

Thuật toánInputĐộ phức tạp
Naive sầu AlgorithmMa trận vuông$O(n^3)$
Naive sầu AlgorithmMa trận bất kì$O(nmp)$
Strassen AlgorithmMa trận vuông$O(n^2.807)$
Coppersmith-Winograd AlgorithmMa trận vuông$O(n^2.376)$
Các thuật tân oán CW cải tiếnMa trận vuông$O(n^2.373)$

Và các bên khoa học vẫn vẫn mải mê phân tích để lấy con số này về $mathcalO(n^2)$


*

Theo một comment của GS Ngô Quang Hưng bên trên Procul, thì những thuật toán thù của Strassen cùng Coppersmith-Winograd chỉ với giá trị lý thuyết là chủ yếu, vào thực tiễn ít ai cần sử dụng cho những ma trận Khủng bởi vì hidden-constant quá rộng cùng implement phức hợp, dễ dẫn đến lỗi .See more: Các Giải Đấu Bóng Đá Trên Thế Giới Hiện Nay, Tổng Hợp Các Giải Bóng Đá Lớn Nhất Thế Giới

Cảm ơn các bạn vẫn theo dõi bài bác viết! các chúng ta cũng có thể follow mình trên Facebook để tại vị câu hỏi, hoặc dấn công bố về các nội dung bài viết mới.