使用Divide and Conquer在Java中使用方形矩阵递归递归?

时间:2014-02-01 09:55:00

标签: java arrays recursion matrix

我有一个学校项目来创建两个版本的javacode,它将两个方形矩阵相乘。为了使它更容易,它们只需要工作2x2,4x4,8x8等。我们有一个看起来像这样的伪代码(取自同一本书中的另一个问题,最有可能):enter image description here

我们将把它变成代码(我只知道Java),我们必须实现分区部分。我们可以选择是否需要普通数组或多维数组。这两个版本的代码是这样的:一个是在分区中创建子矩阵(数组),第二个是使用数组索引并将它们传递下来。

我最困惑的是随机使用数组+数组和底部的int + int。我明白了代码,但我不知道如何正确实现它。

有人能指出我正确的方向吗?

3 个答案:

答案 0 :(得分:2)

这是一个没有处理矩阵的Java实现。这仅适用于nxn矩阵,因此n = 2 ^ x。

public static int[][] matrixMultiplicationFinal(int[][] A, int[][] B){

    return  matrixMultiplication(
            A, B, 0, 0, 
            0,0, A.length);

}


public static int[][] matrixMultiplication(
        int[][] A, int[][] B, int rowA, int colA, 
        int rowB, int colB, int size){

    int[][] C= new int[size][size];

    if(size==1)
        C[0][0]= A[rowA][colA]*B[rowB][colB];

    else{

        int newSize= size/2;
        //C11
         sumMatrix(C, 

            matrixMultiplication(A, B, rowA, colA, rowB, colB, newSize),
            matrixMultiplication(A, B, rowA, colA+newSize, rowB+ newSize, colB, newSize),
        0, 0);

         sumMatrix(C, 

            matrixMultiplication(A, B, rowA, colA, rowB, colB + newSize, newSize),
            matrixMultiplication(A, B, rowA, colA+newSize, rowB+ newSize, colB+newSize, newSize),
        0, newSize);

         sumMatrix(C, 

            matrixMultiplication(A, B, rowA+ newSize, colA, rowB, colB, newSize),
            matrixMultiplication(A, B, rowA+ newSize, colA+newSize, rowB+ newSize, colB, newSize),
        newSize, 0);

         sumMatrix(C, 

            matrixMultiplication(A, B, rowA+ newSize, colA, rowB, colB+newSize, newSize),
            matrixMultiplication(A, B, rowA+ newSize, colA+newSize, rowB+ newSize, colB+newSize, newSize),
        newSize, newSize);
    }

    return C;

}


private static void sumMatrix(int[][] C, int[][]A, int[][]B,int rowC, int colC){
    int n=A.length;
    for(int i =0; i<n; i++){
        for(int j=0; j<n; j++)  
            C[i+rowC][j+colC]=A[i][j]+B[i][j];
    }

}

答案 1 :(得分:0)

if(n==1) {
    c[0][0] = a[0][0] * b[0][0];
} else {
    do partition part;
}
return c;

答案 2 :(得分:0)

Java 7 api中的fork-join框架旨在通过递归调用乘法函数来非常快速地执行这些问题(通过使用计算机中的所有CPU内核)。请看http://docs.oracle.com/javase/tutorial/essential/concurrency/forkjoin.html

您必须在代码中使用矩阵分区替换fork-join框架中的分割,并且每次分成4个子任务(而不是在上面链接中给出的示例中的2个)。不要复制元素来创建更小的矩阵,它会大大减慢程序的速度(并且需要大量的内存!)。只需更改开始和结束以定义子矩阵,同时传递给函数。当您通过将标量相乘来更新C矩阵时,此情况下的阈值将为1。

提示:使用非常小的非对称矩阵测试代码,其大小为4x4,以便您可以手动计算和比较答案。