【问题标题】:Receiving errors when multiplying matrices矩阵相乘时接收错误
【发布时间】:2021-04-19 19:04:27
【问题描述】:

在我的计算机科学 A AP 中,我们必须使用两个类进行矩阵乘法。

我一直遇到问题,使用该函数将矩阵相乘并得到乘积。 这是第一个类,声明并初始化矩阵:

public class Main {
    public static void main(String[] args) {
        int r1 = 3, c1 = 4;
        int r2 = 4, c2 = 2;
        int[][] a = {{1, 2, -2, 0}, {-3, 4, 7, 2}, {6, 0, 3, 1}};
        int[][] b = {{-1, 3}, {0, 9}, {1, -11}, {4, -5}};

        // So there are the matrices
        int[][] mult = matrixMult(a, b, r1, c1, c2);
        displayProduct(product);
    }

    public static void displayProduct(int[][] product) {
        System.out.println("");
        for (int[] row : product) {
            for (int column : row) {
                System.out.println(column + "   ");
            }
            System.out.println();
        }
    }
}

如果矩阵成一个矩阵,这就是我打印乘积的方式。

然后这是应该与矩阵相乘的第二个类:

public class MatrixMult {
    public static int[][] matrixMult(int[][] a, int[][] b) {
        int[][] product = new int[r1][c2];
        for (int i = 0; i < r1; i++) {
            for (int j = 0; j < c2; j++) {
                for (int k = 0; k < c1; k++) {
                    product[i][j] += a[i][k] * b[k][j];
                }
            }
        }
        return product;
    }
}

我尝试运行代码时收到的错误是:

Main.java:14: error: cannot find symbol
int[][] mult = matrixMult(a, b, r1, c1, c2);
               ^
symbol:   method matrixMult(int[][],int[][],int,int,int)
location: class Main
Main.java:16: error: cannot find symbol
displayProduct(product);
               ^
symbol:   variable product
location: class Main
MatrixMult.java:9: error: cannot find symbol
int[][] product = new int[r1][c2];
                          ^
symbol:   variable r1
location: class MatrixMult
MatrixMult.java:9: error: cannot find symbol
int[][] product = new int[r1][c2];
                              ^
symbol:   variable c2
location: class MatrixMult
MatrixMult.java:10: error: cannot find symbol
for (int i = 0; i < r1; i++)  {
                    ^
symbol:   variable r1
location: class MatrixMult
MatrixMult.java:12: error: cannot find symbol
  for (int j = 0; j < c2; j++)  {
                      ^
symbol:   variable c2
location: class MatrixMult
MatrixMult.java:14: error: cannot find symbol
    for (int k = 0; k < c1; k++)  {
                        ^
symbol:   variable c1
location: class MatrixMult

【问题讨论】:

    标签: java arrays matrix matrix-multiplication


    【解决方案1】:

    代码审查。您的代码可能如下所示:

    public class MatrixMult {
        public static int[][] matrixMult(
                // correct number, type and order of variables
                int[][] a, int[][] b, int r1, int c1, int c2)  {
            int[][] product = new int[r1][c2];
            for (int i = 0; i < r1; i++)  {
                for (int j = 0; j < c2; j++)  {
                    for (int k = 0; k < c1; k++)  {
                        product[i][j] += a[i][k] * b[k][j];
                    }
                }
            }
            return product;
        }
    }
    
    public class Main {
        public static void main(String[] args) {
            int r1 = 3, c1 = 4;
            int r2 = 4, c2 = 2;
    
            int[][] a = {{1, 2, -2, 0}, {-3, 4, 7, 2}, {6, 0, 3, 1}};
            int[][] b = {{-1, 3}, {0, 9}, {1, -11}, {4, -5}};
    
            int[][] mult = matrixMult(a, b, r1, c1, c2);
    
            displayProduct(mult);
        }
    
        public static void displayProduct(int[][] product) {
            for (int[] row : product) {
                for (int column : row) {
                    // print as a single line without
                    // a line separator at the end
                    System.out.print(column + "   ");
                }
                // print a line separator
                System.out.println();
            }
        }
    }
    

    输出:

    -3   43   
    18   -60   
    1   -20   
    

    另见:Matrix multiplication using streams

    【讨论】:

      【解决方案2】:

      变量声明在错误的类和方法中。以下声明:

      int r1 = 3, c1 = 4;
      int r2 = 4, c2 = 2;
      int[][] a = {{1, 2, -2, 0}, {-3, 4, 7, 2}, {6, 0, 3, 1}};
      int[][] b = {{-1, 3}, {0, 9}, {1, -11}, {4, -5}};
      

      这些是在Main.main(主类,主方法)中声明的,而您试图在MatrixMult.matrixMult 中调用它们。相反,在matrixMult(方法)中声明它们或在 MatrixMult(类)中声明它们但将它们设为静态。

      另一个问题是你写了matrixMult(a, b, r1, c1, c2);,当matrixMult只接受两个参数时,将a, b, r1, c1, c2作为参数传递:public static int[][] matrixMult(int[][] a, int[][] b)

      堆栈跟踪告诉您:它找不到symbol: method matrixMult(int[][],int[][],int,int,int。所以只需将public static int[][] matrixMult(int[][] a, int[][] b) 重写为public static int[][] matrixMult(int[][] a, int[][] b, int r1, c1, c2)

      请记住,matrixMult 并不“知道”这些变量是什么,因为它们是在不同的方法中声明的。只有当它们作为参数传入时它才知道它们。

      【讨论】:

        猜你喜欢
        • 2015-06-20
        • 1970-01-01
        • 1970-01-01
        • 2016-09-25
        • 2018-04-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多