分治策略实现斯特拉森矩阵乘法
时间: 2023-11-27 20:42:58 浏览: 39
斯特拉森矩阵乘法的分治策略实现如下:
1. 将矩阵A和矩阵B划分为4个大小相等的子矩阵,每个子矩阵的大小为原矩阵的一半。
2. 对于每个子矩阵,递归地计算以下7个临时矩阵:
- S1 = B12 - B22
- S2 = A11 + A12
- S3 = A21 + A22
- S4 = B21 - B11
- S5 = A11 + A22
- S6 = B11 + B22
- S7 = A12 - A22
3. 递归地计算以下7个中间矩阵:
- P1 = A11 * S1
- P2 = S2 * B22
- P3 = S3 * B11
- P4 = A22 * S4
- P5 = S5 * S6
- P6 = S7 * S1
- P7 = S5 * S4
4. 计算结果矩阵C的4个子矩阵:
- C11 = P5 + P4 - P2 + P6
- C12 = P1 + P2
- C21 = P3 + P4
- C22 = P5 + P1 - P3 - P7
5. 将4个子矩阵组合成新矩阵C。
相关问题
斯特拉森矩阵乘法C语言
#include<stdio.h>
#define N 100
int main()
{
int n, i, j, k;
int A[N][N], B[N][N], C[N][N];
printf("Enter the size of matrix: ");
scanf("%d", &n);
printf("Enter the elements of matrix A:\n");
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
scanf("%d", &A[i][j]);
}
}
printf("Enter the elements of matrix B:\n");
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
scanf("%d", &B[i][j]);
}
}
// matrix multiplication
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
C[i][j] = 0;
for(k=0;k<n;k++)
{
C[i][j] += A[i][k] * B[k][j];
}
}
}
printf("Resultant matrix C:\n");
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
printf("%d ", C[i][j]);
}
printf("\n");
}
return 0;
}
证明斯特拉森算法的正确性
斯特拉森算法的正确性可以通过数学归纳法来证明。首先,我们知道当矩阵的阶数为1时,斯特拉森算法的结果即为普通矩阵乘法的结果,所以基本情况成立。
接下来,假设当矩阵的阶数小于等于k时,斯特拉森算法的正确性已经被证明。我们需要证明当矩阵的阶数为k+1时,斯特拉森算法也是正确的。
我们将两个(k+1)阶矩阵A和B进行斯特拉森算法的处理,得到结果矩阵C。然后再用普通矩阵乘法的方法得到C',即C' = AB。
现在我们需要证明C和C'相等。首先,我们将A和B分别划分成四个(k/2)阶的子矩阵:
A = |A11 A12| B = |B11 B12|
|A21 A22| |B21 B22|
其中,A11、A12、A21、A22分别是(k/2)阶矩阵。
然后,我们可以用斯特拉森算法分别计算得到四个结果矩阵:
P1 = A11 * (B12 - B22)
P2 = (A11 + A12) * B22
P3 = (A21 + A22) * B11
P4 = A22 * (B21 - B11)
P5 = (A11 + A22) * (B11 + B22)
P6 = (A12 - A22) * (B21 + B22)
P7 = (A11 - A21) * (B11 + B12)
接下来,我们可以通过这些结果矩阵来计算C的四个子矩阵:
C11 = P5 + P4 - P2 + P6
C12 = P1 + P2
C21 = P3 + P4
C22 = P5 + P1 - P3 - P7
最后,我们可以将这四个子矩阵组合起来得到C矩阵。这样,我们就得到了斯特拉森算法的结果。
同样地,我们可以用普通矩阵乘法的方法计算得到C'矩阵。
通过对比C和C'的每个元素,可以发现它们是相等的。因此,我们证明了斯特拉森算法的正确性。