CLRS 4 2矩陣乘法的Strasson演算法

2021-07-04 04:20:13 字數 4264 閱讀 9971

4.2-1 a11

=1,a

12=3,

a21=7

,a22=

5,b11

=6,b

12=8,

b21=4

,b22=

2 。s1

=8−2

=6,s

2=1+

3=4,

s3=7

+5=12

,s4=

4−6=

−2s5

=1+5

=6,s

6=6+

2=8s

7=3−

5=−2

,s8=

4+2=

6s9=

1−7=

−6,s

10=6+

8=14 p

1=1∗

6=6,

p2=4

∗2=8

,p3=

12∗6=

72,p4

=5∗(

−2)=

−10p5

=6∗8

=48,p

6==−2

∗6=−

12,p7

=−6∗

14=−84

c11=48−10

−8−12

=18,c

12=6+

8=14,

c21=72

−10=62

,c22=

48+6−

72+84=

66

4.2-2

偽**略(只能輸入2的整數次冪大小的矩陣)

#include 

#include

using

std::cin;

using

std::cout;

using

std::endl;

using

std::setw;

void add(int **matrixa,int **matrixb,int **matrixc,int matrixsize)

}}void minus(int **matrixa,int **matrixb,int **matrixc,int matrixsize)

}}void multiply(int **matrixa,int **matrixb,int **matrixc,int matrixsize)}}

}void strassen(int **matrixa,int **matrixb,int **matrixc,int matrixsize)

//分解成小矩陣

for(int i = 0; i < half; ++i)

}//計算s_1到s_10

minus(b_12,b_22,s_1,half);

add(a_11,a_12,s_2,half);

add(a_21,a_22,s_3,half);

minus(b_21,b_11,s_4,half);

add(a_11,a_22,s_5,half);

add(b_11,b_22,s_6,half);

minus(a_12,a_22,s_7,half);

add(b_21,b_21,s_8,half);

minus(a_11,a_21,s_9,half);

add(b_11,b_12,s_10,half);

//計算p_1到p_7

strassen(a_11,s_1,p_1,half);

strassen(s_2,b_22,p_2,half);

strassen(s_3,b_11,p_3,half);

strassen(a_22,s_4,p_4,half);

strassen(s_5,s_6,p_5,half);

strassen(s_7,s_8,p_6,half);

strassen(s_9,s_10,p_7,half);

//計算c_11

add(p_5,p_4,c_11,half);

minus(c_11,p_2,c_11,half);

add(p_6,c_11,c_11,half);

//計算c_12

add(p_1,p_2,c_12,half);

//計算c_21

add(p_3,p_4,c_21,half);

//計算c_22

add(p_5,p_1,c_22,half);

minus(c_22,p_3,c_22,half);

minus(c_22,p_7,c_22,half);

//合併

for(int i = 0; i < half; ++i)

}//釋放分配的陣列

for(int i = 0; i < half; ++i)

delete a_11;delete a_12;

delete a_21;delete a_22;

delete b_11;delete b_12;

delete b_21;delete b_22;

delete c_11;delete c_12;

delete c_21;delete c_22;

delete s_1;delete s_2;

delete s_3;delete s_4;

delete s_5;delete s_6;

delete s_7;delete s_8;

delete s_9;delete s_10;

delete p_1;delete p_2;

delete p_3;delete p_4;

delete p_5;delete p_6;

delete p_7;

}}void printmatrix(int **matrix,int matrixsize)

cout

<< endl;

}}int main()

cout

<< "input array a:"

<< endl;

for(int i = 0; i < length; ++i)

}cout

<< "input array b:"

<< endl;

for(int i = 0; i < length; ++i)

}strassen(ia,ib,ic,length);

printmatrix(ic,length);

for(int i = 0; i < length; ++i)

delete ia;

delete ib;

delete ic;

return

0;}

4.2-3

如果分割矩陣的時候矩陣的行數或列數為奇數,那麼就把乙個全零行或列補在矩陣上,顯然是 θ(

nlg7)

。4.2-4

遞迴式為 t(

n)=k

t(n/

3)+θ

(n) ,由主方法得時間複雜度為 θ(

nlog3k

) 。

所以有:

nlog3k

7⇒log3

k⇒k<3lg

7≈21.84986

4.2-5

從 4.2-4 我們可以得到:

log68

132464

=2.795128

log70

143640

=2.795122

log72

155424

=2.795147

所以 70×

70 的最快。這三種都比 strassen 要好。

4.2-6

利用矩陣分解的方法把矩陣分解為 n×

n 的矩陣,然後利用 strassen 來計算

n 階矩陣。 (k

n×n)

(n×k

n)產生乙個 kn

×kn 矩陣。即 k2

個 n×

n 矩陣。 (n

×kn)

(kn×

n)產生乙個 n×

n 矩陣.。這裡面需要

k 次乘法和 k−

1次加法。

4.2-7 令 a

=(a+

b)(c

+d)=

ac+a

d+bc

+bd,

b=ac

,c=b

d 得到:(b−

c)+(

a−b−

c)i

矩陣乘法 矩陣乘法的基本實現

求解關於兩個矩陣的乘積 參考線性代數裡面的兩個矩陣相乘的規則,我這裡不再贅述,詳情附上了乙個鏈結,我的程式設計也是用了裡面的例子 這裡寫鏈結內容 具體的過程我會在 片裡面加上注釋 矩陣乘法 author seen 2015 09 18 include using namespace std int ...

矩陣的乘法

很久沒寫題了,一直在刷水題,以前一直沒寫過矩陣的乘法,其實一直都是用matlab搞的,這回用c寫了個,和網上流行的那種很像,其實就是模擬第i行和第j列的和,然後放進 c i j 裡面就行了。include include include include include include include...

矩陣的乘法

如下圖 3 行 4列 矩陣,為便於理解將 行數表示為維度,行數表示為乙個點的分向量 既 1,2,3,4 5,6,7,8 9,10,11,12 三組向量,由此可以看出矩陣實質上是由向量組成的。乙個矩陣和 乙個向量相乘 就可將這個矩陣中的每一組向量和 這個單獨向量相乘的結果。根據向量點乘計算法則可以得到...