划分和征服矩阵乘法

Rap*_*rex 8 algorithm math matrix multiplication

我无法分裂并征服矩阵乘法工作.根据我的理解,你将大小为nxn的矩阵分成象限(每个象限是n/2),然后你做:

C11 = A11? B11 + A12 ? B21   
C12 = A11? B12 + A12 ? B22  
C21 = A21 ? B11 + A22 ? B21  
C22 = A21 ? B12 + A22 ? B22  
Run Code Online (Sandbox Code Playgroud)

我的分而治之的输出真的很大,我很难找出问题,因为我对递归并不是很好.

示例输出:

原始矩阵A:

4 0 4 3   
5 4 0 4   
4 0 4 0  
4 1 1 1 
Run Code Online (Sandbox Code Playgroud)

A x A

古典:

44 3 35 15  
56 20 24 35  
32 0 32 12  
29 5 21 17  
Run Code Online (Sandbox Code Playgroud)

分而治之:

992 24 632 408  
1600 272 720 1232   
512 0 512 384  
460 17 405 497  
Run Code Online (Sandbox Code Playgroud)

有人能告诉我,我为分而治之做错了吗?我的所有矩阵都是int[][]经典方法,是传统的3循环矩阵乘法

Nul*_*Set 5

divideAndConquer以错误的方式递归调用.你的函数做的是对矩阵进行平方.为了使分割和征服矩阵乘法起作用,它需要能够将两个可能不同的矩阵相乘.

它应该看起来像这样:

private static int[][] divideAndConquer(int[][] matrixA, int[][] matrixB){
    if (matrixA.length == 2){
         //calculate and return base case
    }
    else {
        //make a11, b11, a12, b12 etc. by dividing a and b into quarters      
        int[][] c11 = addMatrix(divideAndConquer(a11,b11),divideAndConquer(a12,b21));
        int[][] c12 = addMatrix(divideAndConquer(a11,b12),divideAndConquer(a12,b22));
        int[][] c21 = addMatrix(divideAndConquer(a21,b11),divideAndConquer(a22,b21));
        int[][] c22 = addMatrix(divideAndConquer(a21,b12),divideAndConquer(a22,b22));
        //combine result quarters into one result matrix and return
    }
}
Run Code Online (Sandbox Code Playgroud)