矩阵乘法的Strassen算法
来源:互联网 发布:淘宝指数分析 编辑:程序博客网 时间:2024/04/24 23:16
若
我们需要计算
SQUARE-MATRIX-MULTIPLY(A, B)
n = A.rowslet C be a new n*n matrixfor i = 1 to n for j = 1 to n c(ij) = 0 for k = 1 to n c(ij) = c(ij)+a(ik)*b(kj)return C
C语言代码实现如下:
void Mul(int **matrixA,int **matrixB, int **matrixC, int n){ for (int i=0; i < n; ++i){ for (int j=0; j < n; ++j){ matrixC[i][j] = 0; for (int k=0; k < n; ++k) matrixC[i][j] += matrixA[i][k] + matrixB[k][j]; } }}
由于三重for循环的每一重都恰好执行n步,而第7步每次执行都花费常量时间,因此过程SQUARE-MATRIX-MULTIPLY(A, B)花费
试着用一个简单的分治算法优化刚刚的矩阵算法, C = A * B,假定三个矩阵均为 n * n 矩阵,其中 n 为 2 的幂。我们做这个假定因为在每个分解步骤中, n * n 矩阵都被划分为 4 个 n/2 * n/2 的子矩阵,如果假定 n 是 2 的幂, 则 只要
假定将 A、B 和 C 均分解为 4 个 n/2 * n/2 的子矩阵:
A =
因此可以将公式C = A * B 改写为
等价于如下 4 个公式:
直接的递归分治算法:
SQUARE-MATRIX-MULTIPLY-RECURSIVE(A, B)
n = A.rowslet C be a new n * n matrixif n == 1 c11 = a11 * b11else partion A, B, and C as in equations (4, 9) C11 = SQUARE-MATRIX-MULTIPLY-RECURSIVE(A11, B11) + SQUARE-MATRIX-MULTIPLY-RECURSIVE(A12, B21) C12 = SQUARE-MATRIX-MULTIPLY-RECURSIVE(A11, B12) + SQUARE-MATRIX-MULTIPLY-RECURSIVE(A12, B22) C21 = SQUARE-MATRIX-MULTIPLY-RECURSIVE(A21, B11) + SQUARE-MATRIX-MULTIPLY-RECURSIVE(A22, B21) C22 = SQUARE-MATRIX-MULTIPLY-RECURSIVE(A21, B12) + SQUARE-MATRIX-MULTIPLY-RECURSIVE(A22, B22)return C
由于每次递归调用完成两个 n/2 * n/2 矩阵的乘法,因此花费时间为T(n/2), 8 次递归调用总时间为8T(n/2). 我们还需要计算第6-9行的4次矩阵加法。每个矩阵包含
利用主方法求解上式得:
(
可见用了一般的分治算法并没有使算法的 T(n) 减少
所以才有了天才般的Strassen方法,Strassen算法的核心思想是令递归树稍微不那么茂盛一点儿,即只进行7次而不是8次递n/2 * n/2的矩阵乘法。它包含4个步骤:
1. 按公式(4.9)将输入矩阵A、B和输出矩阵C分解为n/2 * n/2 的子矩阵。采用下标计算方法,此步骤花费
2. 创建10个n/2 * n/2的矩阵
3. 用步骤1中创建的子矩阵和步骤2中创建的10个矩阵,递归的计算7个矩阵积
4. 通过
故我们得到Strassen算法的运行时间递归式:
利用主方法可以求解出递归式的解为
创建的十个矩阵:
由于必须进行10次n/2 * n/2的矩阵加减法,因此,该步骤花费
如下所示:
首先
总结:矩阵乘法一般意义上还是选择:朴素的方法(暴力解法),只有当矩阵阶数很大(稠密)时,才会选择Strassen算法.
详细的比较看这里:http://www.mamicode.com/info-detail-673908.html
- 矩阵乘法的Strassen算法
- 矩阵乘法的Strassen算法
- STRASSEN算法(矩阵乘法)
- strassen矩阵乘法算法
- 矩阵乘法Strassen算法的伪代码
- 矩阵乘法的Strassen
- strassen算法(矩阵乘法)
- strassen算法优化矩阵乘法
- 算法导论--------------Strassen矩阵乘法
- 矩阵乘法 之 strassen 算法
- Strassen矩阵乘法算法实现
- Strassen算法之矩阵乘法
- 贪心算法-Strassen矩阵乘法
- 算法导论 第四章矩阵乘法的Strassen算法
- 算法导论之四矩阵乘法的Strassen算法
- 用java写的矩阵乘法(Strassen算法)
- 第四章 4.2矩阵乘法的Strassen算法(分治)
- 基于Strassen算法采用分治的矩阵乘法cpp实现
- Java程序员的推荐阅读书籍
- LeetCode笔记:482. License Key Formatting
- Unicode字符列表(超完整)
- 多项式输出pascal程序
- 修改Cygwin的home目录
- 矩阵乘法的Strassen算法
- Redis学习-持久化
- PHP学习笔记
- [转] AFX_MANAGE_STATE(AfxGetStaticModuleState())
- Camera Service Binder框架
- centos通过yum安装nodejs
- android:descendantFocusability——父容器和子控件的焦点获取问题
- mysql查询排名的方法(yii的写法)
- C语言中通过全局变量引用汇编语言中的全局标签