【问题标题】:Arrays with Static Methods具有静态方法的数组
【发布时间】:2013-02-13 15:13:36
【问题描述】:

我正在尝试使用两种不同的静态方法来操作两个数组

  1. double dot(double[]a, double[]b)
  2. double[][] multiply(double[][]a, double[][]b)

我似乎无法弄清楚如何使用静态方法将两个数组相乘并将那里的值输出给用户我相信我的点积方法很好。我知道我的乘法方法需要使用返回方法,但我不确定如何正确表示它

这是我目前所拥有的:

public class LibMatrix {

    public static void main(String[] args) {

        double[] a = { 8, 5, 6, 3, 2, 1 };
        double[] b = { 9, 8, 4, 1, 4, 7 };
    }

    public static double dot(double[] a, double[] b) {
        double sum = 0.0;
        for (int i = 0; i < a.length; i++)
            sum += a[i] * b[i];
        return sum;

    }

    public static double[][] multiply(double[][] a, double[][] b) {
        int n = 6;
        double[][] c = new double[n][n];
        for (int i = 0; i < n; i++)
            for (int j = 0; i < n; i++)
                c[i][j] = a[i][j] * b[i][j];
        return a;

    }
}

【问题讨论】:

  • 第二种方法是矩阵(二维数组),但是你的“静态数组”是一维的……
  • 我不确定我是否理解这个问题;你不能调用main 中的方法,引用返回值,然后迭代它们吗?
  • return a; -> return c;
  • 另外,int n = 6; -> int n = a.length; assert n == 0 || (a[0].length == n &amp;&amp; b.length == n &amp;&amp; b[0].length == n);
  • 更改了 return a;返回 c;在我最初编写的方法中,我只是更改了它以尝试获得某种类型的输出。所以你说的是我的乘法方法不起作用,因为我的数组是一维的,我怎样才能使它们成为二维的?

标签: java arrays methods static


【解决方案1】:

没有足够的代表发表评论,但您在第二种方法中的返回值应该是 c

测试:

double [][] a = new double [6][6];
double [][] b = new double [6][6];

for(int i = 0; i< a.length;i++){
    for(int j = 0; j< a.length;j++){
        a[i][j] = 3;
        b[i][j] = 2;
    }
}
d = multiply(a,b);

这将返回一个 6x6 矩阵,其中填充了 6s,因此您的方法可以正常工作。

d = [6, 6, 6, 6, 6, 6,
     6, 6, 6, 6, 6, 6,
     6, 6, 6, 6, 6, 6,
     6, 6, 6, 6, 6, 6,
     6, 6, 6, 6, 6, 6,
     6, 6, 6, 6, 6, 6]

【讨论】:

    【解决方案2】:

    以下是一些更正:

    public class LibMatrixTests
    {
       static class LibMatrix {
          public static double dot(double[] a, double[] b) {
             double sum = 0.0;
             for (int i = 0; i < a.length; i++)
                sum += a[i] * b[i];
             return sum;
          }
          public static double[][] mul( double[][] a, double[][] b ) {
             double[][] c = new double[a.length][a[0].length];
             for (int i = 0; i < a.length; i++)
                for (int j = 0; j < a[i].length; j++)
                   c[i][j] = a[i][j] * b[i][j];
             return a;
          }
       }
    
       public static void main( String[] args ) {
          double[]   a = { 8, 5, 6, 3, 2, 1 };
          double[]   b = { 9, 8, 4, 1, 4, 7 };
          double[][] c = { a, b };
          double[][] d = { b, a };
          double     e = LibMatrix.dot( a, b );
          double[][] f = LibMatrix.mul( c, d );
          System.out.println( e );
          for( double[] g : f ) {
             for( double h : g ) {
                System.out.print( h + ", " );
             }
             System.out.println();
          }
       }
    }
    

    输出:

    154.0
    8.0, 5.0, 6.0, 3.0, 2.0, 1.0, 
    9.0, 8.0, 4.0, 1.0, 4.0, 7.0, 
    

    【讨论】:

    • 非常感谢,这正是我想让程序做的事情,现在是时候跟踪并看看你是如何做到的:)
    • 使用 diff 实用程序,因为您在 for 循环中误用了索引 i 和 j,导致 IndexOutOfBoundsException
    【解决方案3】:

    在multiply方法中,第二个循环是错误的,j总是0,应该返回c而不是a

    试试这个

    public static double[][] multiply(double[][] a, double[][] b) {
        int n = 6;
        double[][] c = new double[n][n];
        for (int i = 0; i < n; i++)
            for (int j = 0; j < n; j++)
                c[i][j] = a[i][j] * b[i][j];
        return c;
    
    }
    

    【讨论】:

      猜你喜欢
      • 2012-04-19
      • 1970-01-01
      • 1970-01-01
      • 2013-10-20
      • 1970-01-01
      • 1970-01-01
      • 2012-07-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多