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 三組向量,由此可以看出矩陣實質上是由向量組成的。乙個矩陣和 乙個向量相乘 就可將這個矩陣中的每一組向量和 這個單獨向量相乘的結果。根據向量點乘計算法則可以得到...