【问题标题】:Square Matrix Multiply Recursive in Java using Divide and Conquer?使用分而治之的Java中的方阵乘法递归?
【发布时间】:2014-02-25 02:52:32
【问题描述】:

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

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

我最困惑的是底部的array + array和int + int的随机使用。我得到了代码的想法,但我不知道如何正确地实现它。

谁能指出我正确的方向??

【问题讨论】:

  • A_ij是从原矩阵A中删除第i行第j列后剩下的子矩阵吗?另外,你可以使用外部库吗?

标签: java arrays recursion matrix


【解决方案1】:

这是一个没有处理矩阵的 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];
    }

}

【讨论】:

    【解决方案2】:
    if(n==1) {
        c[0][0] = a[0][0] * b[0][0];
    } else {
        do partition part;
    }
    return c;
    

    【讨论】:

    • 这有点忽略了困难的部分:p
    【解决方案3】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2020-04-11
      • 2017-07-16
      • 2017-12-05
      • 2019-08-02
      • 2012-03-04
      • 1970-01-01
      • 1970-01-01
      • 2016-11-17
      • 1970-01-01
      相关资源
      最近更新 更多