Умножение трехмерных массивов в Java - PullRequest
4 голосов
/ 26 марта 2012

Проблема в следующем: скажем, у вас есть 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;
}

1 Ответ

1 голос
/ 26 марта 2012

Советы Paulsm4 совершенно не нужны - вы не хотите делать все это всего лишь двумя функциями. Вы должны иметь входной массив, пользовательский ввод, умножение и вывод, каждый в своих функциях. Вы можете найти другие возможности для разделения вашей программы во время работы над ней - я настоятельно рекомендую разбить вашу программу на как можно больше функций, особенно потому, что вы можете отлаживать маленькие фрагменты гораздо эффективнее, чем большие. (Что не так с вашей текущей программой? Ввод? Вывод? Вычисление? Размеры хранилища данных, как заметил Адам? Трудно сказать, потому что вы не знаете, какие функции работают отлично, а какие все еще глючат.)

Я бы хотел предложить еще одно изменение: не размещайте пункты 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 prompt и Scanner in параметров и возвращает число больше нуля - может подскажите и повторите при необходимости, и результат будет именно то, что ваш Основной код потребности - держать его как можно более чистым. Эта функция больше очевидно, полезно, когда код переписывается таким образом.)

Что касается ошибки, которая привела вас сюда, я думаю это, вероятно, виновник:

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

Вы рассчитываете лот здесь, но не сохраняете результаты вообще. Вам не нужны эти результаты для дальнейшего расчета?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...