矩阵相乘Strassen算法Java实现

前言

  我们都知道矩阵相乘的规则,矩阵1的m行与矩阵2的n列对应的位置的乘积之和即为结果矩阵m行n列的值,所以只有当矩阵1的列数等于矩阵2的行数时,才可以进行相乘。其实矩阵的本质是线性方程式的表示形式,比如:
这里写图片描述
这里写图片描述
  好了,本篇博客重点不在这里。

经典方法

  矩阵相乘的经典实现就是按照相乘规则来编写的,三重循环即可

public static void mutipleMatrix(int[][] matrix1, int[][] matrix2, 
            int[][] result, int row1, int col1, int col2){
        for(int i = 0; i < row1; i++)
            for(int k = 0; k < col2; k++)
                for(int j = 0; j < col1; j++)
                    result[i][k] += matrix1[i][j] * matrix2[j][k];
    }

  以上方法的复杂度为O(n的三次方),当矩阵维数爆炸时,你的程序一定也会崩溃的,哈哈,下面我们就来看看科学家改进的方法。

Strassen方法

  该方法的思想就是分治法,即把一个大问题划分为一个个小问题,对这些小问题逐个击破,分而治之。
  一个为2的幂次方的大小为N的矩阵,总是划分为4个大小为N/2的矩阵,所以两个矩阵相乘,又可以是各个分块相乘,虽然这里也是采用了分治法,但是乘法操作还是没有减少,故而复杂度还是没变。看图:
这里写图片描述
  我们发现上诉分治的时候每次乘法操作都是8次,4次加法操作。在计算机中,乘法操作是非常耗时,如果能减少乘法次数,势必会降低复杂度。科学家Strassen就想出了一个方法,通过各种凑数,终于发现可以通过对划分的4个小矩阵进行7次变换,可以减少一次乘法操作。多么牛啊,这就是大神,我佩服。
  那么他构造的7个式子是什么呢?看图:
这里写图片描述
  上图中的a,b,c,d…是之前我们划分过得小矩阵。最后的我们可以根据画递归树或者主定理得到复杂度为O(n的2.81次方)!

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值