1. 程式人生 > >四中矩陣相乘方法對比

四中矩陣相乘方法對比

mage idt -128 img ear char ras 隨機 元素

在公茂果老師的課件中,給出了三種矩陣相乘的方法:

1. 利用矩陣定義,對矩陣進行運算。即C(i,j)=A(i,k)*B(k,j),時間復雜度為:

  • 每一個元素需時間n
  • C矩陣共有n2個元素
  • 因此,總的時間復雜度為n3

其實現代碼為:

    tic;
    C2=zeros(n(m));
    for i=1:n(m)
        for j=1:n(m)
            for k=1:n(m)
                C2(i,j)=C2(i,j)+A(i,k)*B(k,j);
            end
        end
    end
    t2(m)=toc;

2.利用分治法進行計算。分治法的核心,在於將原問題切割,這裏將原矩陣A與B,分別切割成四個子矩陣,分別得到C11,C12,C21,C22,在矩陣相乘階段,利用的是MATLAB自帶的矩陣相乘函數。

對於C11為例,其時間復雜度為:

  • 每一個元素需要時間為n/2
  • 共有(n/2)2個這樣的元素
  • 因此,其時間復雜度為(n/2)3
  • 總時間為上一個的1/8

期實代碼為

    A11=A(1:n(m)/2,1:n(m)/2);
    A12=A(1:n(m)/2,n(m)/2+1:n(m));
    A21=A(n(m)/2+1:n(m),1:n(m)/2);
    A22=A(n(m)/2+1:n(m),n(m)/2+1:n(m));
    B11=B(1:n(m)/2,1:n(m)/2);
    B12=B(1:n(m)/2,n(m)/2+1:n(m));
    B21=B(n(m)/2+1:n(m),1:n(m)/2);
    B22=B(n(m)/2+1:n(m),n(m)/2+1:n(m));
    %矩陣計算,開始計時
    tic;
    C3=zeros(n(m));
    C11=A11*B11+A12*B21;
    C12=A11*B12+A12*B22;
    C21=A21*B11+A22*B21;
    C22=A21*B12+A22*B22;
    C3=[C11 C12;C21 C22];
    t3(m)=toc;

3.利用Strassen方法

技術分享

上面的圖片,已經給的非常的清楚,其時間復雜度為n2.81

下面貼出完整的代碼

clc;
close all;
clear all;
n=[2^2 2^3 2^4 2^5 2^6 2^7 2^8 2^9 2^10 2^11 2^12];
for m=1:11
    %%%%采用MATLAB自帶函數進行矩陣相乘
    A=round(rand(n(m)));%生成隨機矩陣A
    B=round(rand(n(m)));%生成隨機矩陣B
    %自帶函數計時
    tic;
    C1=A*B;
    t1(m)=toc;
    %按照矩陣相乘的定義進行計算
    tic;
    C2=zeros(n(m));
    for i=1:n(m)
        for j=1:n(m)
            for k=1:n(m)
                C2(i,j)=C2(i,j)+A(i,k)*B(k,j);
            end
        end
    end
    t2(m)=toc;
    %分治法,思路,對AB矩陣進行切割後,仍使用MATLAB自帶的函數進行
    %步驟一,將原來的矩陣分塊切割成四個,這四個子矩陣,還會用到Strassen的方法中
    A11=A(1:n(m)/2,1:n(m)/2);
    A12=A(1:n(m)/2,n(m)/2+1:n(m));
    A21=A(n(m)/2+1:n(m),1:n(m)/2);
    A22=A(n(m)/2+1:n(m),n(m)/2+1:n(m));
    B11=B(1:n(m)/2,1:n(m)/2);
    B12=B(1:n(m)/2,n(m)/2+1:n(m));
    B21=B(n(m)/2+1:n(m),1:n(m)/2);
    B22=B(n(m)/2+1:n(m),n(m)/2+1:n(m));
    %矩陣計算,開始計時
    tic;
    C3=zeros(n(m));
    C11=A11*B11+A12*B21;
    C12=A11*B12+A12*B22;
    C21=A21*B11+A22*B21;
    C22=A21*B12+A22*B22;
    C3=[C11 C12;C21 C22];
    t3(m)=toc;
    %Strassen方法,公茂果老師的課件中,已經給出了初始化方法
    tic;
    C4=zeros(n(m));
    M1=A11*(B12-B22);
    M2=(A11+A12)*B22;
    M3=(A21+A22)*B11;
    M4=A22*(B21-B11);
    M5=(A11+A22)*(B11+B22);
    M6=(A12-A22)*(B21+B22);
    M7=(A11-A21)*(B11+B12);
    C11=M5+M4-M2+M6;
    C12=M1+M2;
    C21=M3+M4;
    C22=M5+M1-M3-M7;
    C4=[C11 C12;C21 C22];
    t4(m)=toc;
end
%這裏四個方法已經全部結束,接下來就是輸出圖片
x=log(n)/log(2)%橫軸取對數
plot(x,t1,x,t2,x,t3,x,t4);
xlabel(‘log(n)/log(2)‘);
ylabel(‘time‘);
title(‘The comparison chart of four different methods for Matrix multiplication‘)
    
 

運行時間比較長,請耐心等待。其結果為:

技術分享

沒設置好,所以,看著不是特別清楚,可以在關鍵的節點處,設置*等,特別現實一下。

四中矩陣相乘方法對比