加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

在Java中乘以三维数组

发布时间:2020-12-15 02:32:40 所属栏目:Java 来源:网络整理
导读:问题是:假设你有一个3d数组,Z(所以int [] [] [] Z = new int [n] [n] [n]).你要做的是打印一个新的3d数组,即Z,X倍的乘法. 说你有 z[3][3][3] = { {{3,3,3}{3,3}} {{3,3}} } 和x = 3(用户输入) 目标是打印出来: Z[0]Z[1]XXXXXXXZ[0]*Z[0]Z[1]*Z[1]XXXXXXXZ[
问题是:假设你有一个3d数组,Z(所以int [] [] [] Z = new int [n] [n] [n]).你要做的是打印一个新的3d数组,即Z,X倍的乘法.

说你有

z[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;
}

解决方法

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

我想建议一个进一步的改变:如果你可以提供帮助,不要把你的测试的其他条款放在如此遥远的地方.考虑改变这个:

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提示符的函数
参数中的扫描仪并返回大于零的数字 – 它可以
根据需要提示并重新提示,结果将是你的
主要代码需求 – 尽可能保持清洁.这个功能更多
当代码以这种方式重写时显然很有用.)

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

System.out.printf("%f ",q));

你在这里计算很多,但根本不存储结果.你不需要这些结果进一步计算吗?

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读