第四章 4.2矩阵乘法的Strassen算法(分治)

注意:虽然联系4.2-3、4.2-4和4.2-5是关于Strassen算法的变形的,但你应该先阅读4.5节,然后再尝试求解这几个问题。
####4.2-1 使用Strassen算法计算如下矩阵乘法: [ 1 3 7 5 ] [ 6 8 4 2 ] \begin{bmatrix}1&3\\ 7&5\end{bmatrix} \begin{bmatrix}6&8\\4&2 \end{bmatrix} [1735][6482]给出计算过程。

S 1 = B 12 − B 22 = 8 − 2 = 6 S 2 = A 11 + A 12 = 1 + 3 = 4 S 3 = A 21 + A 22 = 7 + 5 = 12 S 4 = B 21 − B 11 = 4 − 6 = − 2 S 5 = A 11 + A 22 = 1 + 5 = 6 S 6 = B 11 + B 22 = 6 + 2 = 8 S 7 = A 12 − A 22 = 3 − 5 = − 2 S 8 = B 21 + B 22 = 4 + 2 = 6 S 9 = A 11 − A 21 = 1 − 7 = − 6 S 10 = B 11 + B 12 = 6 + 8 = 14 P 1 = A 11 ⋅ S 1 = 6 P 2 = S 2 ⋅ B 22 = 8 P 3 = S 3 ⋅ B 11 = 72 P 4 = A 22 ⋅ S 4 = − 10 P 5 = S 5 ⋅ S 6 = 48 P 6 = S 7 ⋅ S 8 = − 12 P 7 = S 9 ⋅ S 1 0 = − 84 C 11 = P 5 + P 4 − P 2 + P 6 = 48 − 10 − 8 − 12 = 18 C 12 = P 1 + P 2 = 6 + 8 = 14 C 21 = P 3 + P 4 = 72 − 10 = 62 C 22 = P 5 + P 1 − P 3 − P 7 = 48 + 6 − 72 + 84 = 66 综上所述,计算出的矩阵值为 [ 18 14 62 66 ] S_1=B_{12}-B_{22}=8-2=6 \\ S_2=A_{11}+A_{12}=1+3=4 \\ S_3=A_{21}+A_{22}=7+5=12 \\ S_4=B_{21}-B_{11}=4-6=-2 \\ S_5=A_{11}+A_{22}=1+5=6 \\ S_6=B_{11}+B_{22}=6+2=8 \\ S_7=A_{12}-A_{22}=3-5=-2 \\ S_8=B_{21}+B_{22}=4+2=6 \\ S_9=A_{11}-A_{21}=1-7=-6 \\ S_{10}=B_{11}+B_{12}=6+8=14 \\ P_1=A_{11}·S_1=6 \\ P_2=S_2·B_{22}=8 \\ P_3=S_3·B_{11}=72 \\ P_4=A_{22}·S_4=-10 \\ P_5=S_5·S_6=48 \\ P_6=S_7·S_8=-12 \\ P_7=S_9·S_10=-84 \\ C_{11}=P_5+P_4-P_2+P_6=48-10-8-12=18 \\ C_{12}=P_1+P_2=6+8=14 \\ C_{21}=P_3+P_4=72-10=62 \\ C_{22}=P_5+P_1-P_3-P_7=48+6-72+84=66 \\综上所述,计算出的矩阵值为 \begin{bmatrix}18&14\\62&66 \end{bmatrix} S1=B12B22=82=6S2=A11+A12=1+3=4S3=A21+A22=7+5=12S4=B21B11=46=2S5=A11+A22=1+5=6S6=B11+B22=6+2=8S7=A12A22=35=2S8=B21+B22=4+2=6S9=A11A21=17=6S10=B11+B12=6+8=14P1=A11S1=6P2=S2B22=8P3=S3B11=72P4=A22S4=10P5=S5S6=48P6=S7S8=12P7=S9S10=84C11=P5+P4P2+P6=4810812=18C12=P1+P2=6+8=14C21=P3+P4=7210=62C22=P5+P1P3P7=48+672+84=66综上所述,计算出的矩阵值为[18621466]

####4.2-2 为Strassen算法编写伪代码。

Strassen(A,B)
n=A.rows
let C be a new nxn matrix
if n==1
	c=a*b
else partition A,B,and C as in equations(4,9)
	S1=B12-B22
	S2=A11-A12
	S3=A21+A22
	S4=B21-B11
	S5=A11+A22
	S6=B11+B22
	S7=A12-A22
	S8=B21+B22
	S9=A11-A21
	S10=B11+B12
	P1=Strassen(A11,S1)
	P2=Strassen(A11,B22)
	P3=Strassen(S3,B11)
	P4=Strassen(A22,S4)
	P5=Strassen(S5,S6)
	P6=Strassen(S7,S8)
	P7=Strassen(S9,S10)
	C11=P5+P4-P2+P6
	C12=P1+P2
	C21=P3+P4
	C22=P5+P1-P3-P7
	return C

####4.2-3 如何修改Strassen算法,使之适应矩阵规模n不是2的幂的情况?证明:算法的运行时间为 θ ( n l g 7 ) \theta(n^{lg7}) θ(nlg7)
将矩阵先补成2的幂情况。
证明:http://www.mamicode.com/info-detail-673908.html
####4.2-4 如果可以用k次乘法操作(假定乘法的交换律不成立)完成两个3x3矩阵相乘,那么你可以在O( n l g 7 n^{lg7} nlg7)时间内完成nxn的矩阵相乘,满足这一条件的最大的k是多少?此算法的运行时间是怎样的?
将矩阵补成44的矩阵
7+4
7=35=k
O( 4 l g 7 4^{lg7} 4lg7
####4.2-5 V.Pan发现一种方法,可以用132464次乘法操作完成68x68的矩阵相乘,发现另一种方法,可以用143 640次乘法操作完成70x70的矩阵相乘,还发现一种方法,可以用155 424 次乘法操作完成72x72的矩阵相乘。当用于矩阵相乘的分治算法时,上述哪种方法会得到最佳的渐进运行时间?与Strassen算法相比,性能如何?
Strassen运行次数为:135215,146647,158682(就比例来说第三种方法好一些,但算法的的控制因素有两个,不能直接因此做判断)
目前次数的运算来说,好于Strassen,但算法好坏好要靠其他因素综合来判断。
####4.2-6 用Strassen算法作为子进程来进行一个kn X n矩阵和一个nXkn的矩阵相乘,最快需要花费多长时间?对两个输入矩阵规模互换的情况,回答相同的问题。
1)先补成kn*kn,再补成齐二次幂。
2)相同
####4.2-7 设计算法,仅使用三次实数乘法即可完成复数a+bi和c+di相乘。算法需接受a、b、c和d为输入,分别生成实部ac-bd和虚部ad+bc。
(a+b)(c-d)、ad、bc

  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值