【问题标题】:Multiplying 3-dimensional arrays in Java在 Java 中乘以 3 维数组
【发布时间】:2012-03-26 02:02:32
【问题描述】:

问题是这样的:假设你有一个 3d 数组 Z(所以 int[][][] Z = new int[n][n][n])。您要做的是打印出一个新的 3d 数组,即 Z、X 次的乘法。

说你有

z[3][3][3] = {
                   {{3,3,3}{3,3,3}}
                   {{3,3,3}{3,3,3}}
                   {{3,3,3}{3,3,3}}
                  }

和 x = 3(用户输入)

目标是打印出来:

Z[0]
Z[1]
XXXXXXX
Z[0]*Z[0]
Z[1]*Z[1]
XXXXXXX
Z[0]*Z[0]*Z[0]
Z[1]*Z[1]*Z[1]

由于这是一个正方形(实际上是立方体...)矩阵,因此每个打印出来的矩阵都是相同的尺寸。我到目前为止是这样的:

   public static void main(String[] args) {
    Scanner getIt = new Scanner(System.in);
    System.out.println("Input 1 integer n: ");
    int n = getIt.nextInt();
    if (n > 0){
        final double M[][][] = new double[n][n][n];
        for (int i = 0; i < n; i++)
            for (int j = 0; j < n; j++)
                for (int k = 0; k < n; k++)
                    M[i][j][k] = 3.0;
        System.out.println("Input 1 integer p: ");
        int p = getIt.nextInt();
        if(p > 0){
          for(int q = 1; q <= p; q++){
              for (int i = 0; i < n; i++){
                  for (int j = 0; j < n; j++){
                      for (int k = 0; k < n; k++){
                          System.out.printf("%f ", Math.pow(matrixMult(M[i], M[i])[j][k], q));
                      }
                      System.out.println("\n");
                  }

              }
              System.out.println("xxxxxxxxxxxxxxxxxxxxx");
          }
        }
        else{
            System.out.println("Woops, you entered a negative p.");
        }
    }
    else{
        System.out.println("Woops, you entered a negative n.");
    }
}

public static double[][] matrixMult(double a[][], double b[][]) {   
    int aRows = a.length; 
    int aCols = a[0].length; 
    int bCols = b[0].length;
    double[][] result = new double[aRows][bCols];   
    for(int i = 0; i < aRows; i++){ 
        for(int j = 0; j < bCols; j++){ 
            for(int k = 0; k < aCols; k++){ 
                result[i][j] += a[i][k] * b[k][j];      
                }
            }  
        }   
    return result;
}

【问题讨论】:

  • 我读到 z 将始终是一个立方体矩阵,但在您的示例中 z 是 2 x 2 x 3。什么给出?
  • 我不认为你想要所有东西都在一个大循环中,是吗?我怀疑你真的想要三个部分:1)获取输入,2)乘法,3)打印结果。不是吗?
  • @AdamMihalcin 是的,我的错!固定
  • 为什么是“立方体”?仅仅拥有三个二维数组(A[] * B[] = Z[])不是更简洁更容易吗?
  • @paulsm4 好主意...我最初尝试过,但发现代码要多得多,也许我现在再试一次。

标签: java matrix


【解决方案1】:

Paulsm4 的建议是完全正确的——你不想只用两个函数来完成整个事情。您应该在各自的函数中拥有输入数组、用户输入、乘法和输出。您可能会在处理程序时找到其他机会来拆分程序——我强烈建议您将程序尽可能地分解为函数,特别是因为您可以比调试大块更有效地调试小块。 (您当前的程序有什么问题?输入?输出?计算?数据存储大小,正如 Adam 注意到的那样?很难说,因为您不知道哪些功能可以完美运行,哪些仍然存在问题。)

我想提出进一步的改变:如果你能帮忙的话,不要把你的测试的else 子句放得太远。考虑改变这个:

int n = getIt.nextInt();
if (n > 0){
/* loop */
    System.out.println("Input 1 integer p: ");
    int p = getIt.nextInt();
    if(p > 0){
    /* loop loop loop */
    }
    else{
        System.out.println("Woops, you entered a negative p.");
    }
}
else{
    System.out.println("Woops, you entered a negative n.");
}

到这里:

int n = getIt.nextInt();
if (n <= 0) {
    System.out.println("Woops, you entered a negative n.");
/* exit or recover */
}

System.out.println("Input 1 integer p: ");
int p = getIt.nextInt();
if (p <= 0) {
    System.out.println("Woops, you entered a negative p.");
/* exit or recover */
}

/* loop */

/* loop loop loop */

以这种方式编写代码将使维护变得更加容易,并且 可能还可以更容易地发现可以删除的单位 自己的套路。 (考虑一个采用String promptScanner in 参数并返回一个大于零的数字——它可以 提示并根据需要重新提示,结果将正是您的 主要代码需要——尽可能保持干净。这个功能更 当以这种方式重写代码时显然很有用。)

至于把你带到这里的错误,我认为这可能是罪魁祸首:

System.out.printf("%f ", Math.pow(matrixMult(M[i], M[i])[j][k], q));

您在此处计算 很多,但根本不存储结果。您不需要这些结果进行进一步计算吗?

【讨论】:

  • 是的,非常正确,尤其是最后一点。直到现在我才注意到我实际上是过度乘法,使我的答案太大......
  • 我想我对如何在不先声明 n 个新数组然后填充它们的情况下将其分解为 n 个 2D 数组感到有些困惑。显然我不能先知道n,那我该怎么办?我在这一点上相当卡住......
  • 我一直满足于忽略问题的 3d 数组 部分,假设您比我了解更多 :) -- 我假设您有一个合适的3d 数组上的乘法定义,您可以轻松使用。但是,there is a convenient mechanism to raise 2d arrays to powers可能能够扩展到您的 3d 数组。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-01-13
  • 1970-01-01
  • 2016-04-15
  • 1970-01-01
  • 2022-07-12
  • 2020-11-25
相关资源
最近更新 更多