【问题标题】:Matrix multiply in JavaJava中的矩阵乘法
【发布时间】:2017-11-23 11:46:19
【问题描述】:

我创建了一个函数来与一个矩阵相乘,它有两个参数,一个是矩阵,另一个是int n。问题是我不知道应该在我的代码中在哪里使用n,以便它将矩阵本身乘以n 的次数(换句话说,matrix^n)。在当前阶段它只做matrix^2;

public static int[][] lungimeDrumuri(int[][] array, int n) {
    int[][] newArray = new int[array.length][array.length];
    for (int i = 0; i < array.length; i++) {
        for (int j = 0; j < array.length; j++) {
            int sum = 0;
            for (int x = 0; x < array.length; x++) {
                sum += array[i][x] * array[x][j];
            }
            newArray[i][j] = sum;
        }
    }
    return newArray;
}

【问题讨论】:

    标签: java multidimensional-array matrix-multiplication


    【解决方案1】:

    添加从 1 &lt; k &lt; n 开始的第三个 for 循环。您将需要保持array 保持不变以保持初始矩阵的值,还需要一个矩阵newArray 来保持先前乘法的值和一个临时矩阵tmp 在乘法期间只保存值本身,然后复制到newArray。 请看下面的示例。

    完整代码

    public static int[][] lungimeDrumuri(int[][] array, int n) {
        int[][] newArray = new int[array.length][array.length];
        // Just holds values during multiplication between two matrices
        int[][] tmp = new int[array.length][array.length];
        
        // Initialize newArray to be equal to array
        for (int i = 0; i < array.length; i++) {
            for (int j = 0; j < array.length; j++) {
                newArray[i][j] = array[i][j];
            }
        }
    
        // Outer loop that multiplies as many times as you want
        for (int k = 1; k < n; k++) {
            for (int i = 0; i < array.length; i++) {
                for (int j = 0; j < array.length; j++) {
                    int sum = 0;
                    for (int x = 0; x < array.length; x++) {
                        sum += newArray[i][x] * array[x][j]; // Use newArray here
                    }
                    tmp[i][j] = sum;
                }
            }
            // Copy the result from multiplication to newArray and restart tmp
            System.arraycopy(tmp, 0, newArray, 0, tmp.length);
            tmp = new int[array.length][array.length];
        }
    
        return newArray;
    }
    

    希望对您有所帮助!

    【讨论】:

      【解决方案2】:

      为了清楚起见,您可以创建两种方法:第一种方法是乘方矩阵,第二种方法是调用第一个n 的次数。

      public static int[][] lungimeDrumuri(int[][] array, int n) {
          int[][] newArray = array;
          for (int i = 0; i < n; i++) {
              newArray = squareMatrixMultiplication(newArray);
          }
          return newArray;
      }
      
      public static int[][] squareMatrixMultiplication(int[][] array) {
          int[][] newArray = new int[array.length][array.length];
          for (int i = 0; i < array.length; i++) {
              for (int j = 0; j < array.length; j++) {
                  for (int x = 0; x < array.length; x++) {
                      newArray[i][j] += array[i][x] * array[x][j];
                  }
              }
          }
          return newArray;
      }
      

      【讨论】:

        【解决方案3】:

        初始化newArray等于数组,然后 在矩阵乘法周围添加一个循环并在嵌套循环中使用newArray:将newArray 乘以数组。

        public static int[][] lungimeDrumuri(int[][] array, int n) {
            int[][] newArray = new int[array.length][array.length];
            // Add loops to initialize newArray to array
            for (int i = 0; i < array.length; i++) {
                for (int j = 0; j < array.length; j++) {
                    newArray[i][j] = array[i][j];
                }
            }
            for (int j = 0; j < n; j++) {   // Add this loop
                for (int i = 0; i < array.length; i++) {
                    for (int j = 0; j < array.length; j++) {
                        int sum = 0;
                        for (int x = 0; x < array.length; x++) {
                            sum += newArray[i][x] * array[x][j];  // Use newArray here
                        }
                        newArray[i][j] = sum;
                    }
                }
            } // and this
            return newArray;
        }
        

        【讨论】:

          【解决方案4】:
          public class MyClass {
              public static void main(String args[]) {
                  int array[][] = new int[2][2];
                  array[0][0] = 1;
                  array[0][1] = 2;
                  array[1][0] = 3;
                  array[1][1] = 4;
                  int newArray[][] = new int[2][2];
                  //initialize array with these elements
                  newArray[0][0] = 1;
                  newArray[0][1] = 0;
                  newArray[1][0] = 0;
                  newArray[1][1] = 1;
                  int n = 5;
                  for (int i = 0; i < n; i++) {
                      newArray = lungimeDrumuri(array, newArray, i);
                  }
              }
          
              public static int[][] lungimeDrumuri(int[][] array, int newArray[][], int n) {
                  int newArray1[][] = new int[array.length][array.length];
                  for (int i = 0; i < array.length; i++) {
                      for (int j = 0; j < array.length; j++) {
                          int sum = 0;
                          for (int x = 0; x < array.length; x++) {
                              sum += array[i][x] * newArray[x][j];
                          }
                          newArray1[i][j] = sum;
                      }
                  }
                  return newArray1;
              }
          }
          

          希望这篇文章对你有所帮助。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2011-01-05
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多