Java 二维数组符号和默认访问

Java two dimensional array notation and default access

来自以下代码:

   /** Array for internal storage of elements.
   @serial internal array storage.
   */
   private double[][] A;

   /** Row and column dimensions.
   @serial row dimension.
   @serial column dimension.
   */
   private int m, n;

public Matrix times (Matrix B) {
      if (B.m != n) {
         throw new IllegalArgumentException("Matrix inner dimensions must agree.");
      }
      Matrix X = new Matrix(m,B.n);
      double[][] C = X.getArray();
      double[] Bcolj = new double[n];
      for (int j = 0; j < B.n; j++) {
         for (int k = 0; k < n; k++) {
            Bcolj[k] = B.A[k][j];
         }
         for (int i = 0; i < m; i++) {
            double[] Arowi = A[i];
            double s = 0;
            for (int k = 0; k < n; k++) {
               s += Arowi[k]*Bcolj[k];
            }
            C[i][j] = s;
         }
      }
      return X;
   }

double[] Arowi = A[i];

这条线是做什么的? A是一个二维矩阵,为什么A[i]是允许的?它到底在做什么? 和A[i][0]一样吗?

这种表示法令人困惑。

也有人可以将该行翻译成 .NET,你会如何使用 double[,] Matrix

我知道有一个 Matrix.GetLength() 可以给你指定的维度长度。 但是与那行 Java 代码相比,那将如何翻译?

编辑 我相信我只是通过替换那条线并传入我的矩阵来修复它,将第一行复制到一个新的一维矩阵中并返回它

 public double[] ConvertFirstRowOfMultiArrayToOneArray(double[,] p)
        {
            double[] array = new double[p.Length];
            for (int i = 0; i < p.GetLength(0); i++)
            {
                array[i] = p[0, i];
            }

            return array;
        }

不确定它在 C# (.NET) 中的表现如何,但 java 与二维(多)维数组完全不同。它只有数组的数组(数组的数组......)。所以可以有非矩形数组数组。

double[] Arowi = A[i]; 表示声明名为 Arowi 类型 array of doubles 的新变量并将其设置为 A[i] 这是 [= 的第 i 个(从零开始)成员14=].

A[i][0]不一样,因为这是A的第i个成员的第0个成员。

编辑:我没有进行任何代码审查。

What is this line doing?

是将声明为一维数组的Arowi设置为数组A[i]

假设这种情况:

double[][] A = new double[2][2];
A[0][0] = 1.5;
A[0][1] = 2.5;
A[1][0] = 3.5;
A[1][0] = 4.5;

double[] B = A[0]; // Imagine A[0] as A[i]

/* then value of B is now A[0]
so B is now a unidimensional array containing value:
B[0] == 1.5 == A[0][0]
B[1] == 2.5 == A[0][1] */

A is a two dimensional Matrix, why is A[i] allowed?

因为如您所见,您将一维数组值 (B||Arowi) 设置为包含 A[i] 数组的第二维。

想象一下 A[i] 本身包含另一个数组(二维)。所以我们将这个维度保存到一个新变量中。在这种情况下,它将引用内存地址,而不是值本身,如果我没有混淆的话,例如,如果您在 Arowi||B 中编辑值,它将在原始数组中发生变化。

示例:

B[0] == 1.5 == TRUE
B[0] = 1.75
A[0][0] == 1.5 == FALSE
A[0][0] == 1.75 == TRUE

and what exactly is it doing?

我在示例中解释。

如果我没有混淆的话,应用程序正在执行以下操作:

保存的是A数组(当前数组member/attribute在class(A)中的乘积(加运算,s += Arowi[k]*Bcolj[k])的结果,也可能是矩阵class 本身,我无法通过 B 列(参数采用的矩阵对象)的值看到所有代码)。在每个主循环中,它通过 B 中的一个新列,将所有行的值存储在该列中,然后循环整个 A 数组或 class 数组,将结果存储在 C 中,然后将其作为 a 返回矩阵对象。我希望它是可以理解的,我不会感到困惑。

Is that the same thing as A[i][0]?

没有

A[i][0] 设置值。 A[i] 设置一维数组

对不起,我的英语不好,我希望你能理解,并且描述和想法是正确的。

编辑

看例子:

static void Main(string[] args)
    {
        double[][] A = new double[2][] { new double[2], new double[2] };
        A[0][0] = 1.5;
        A[0][1] = 2.5;
        A[1][0] = 3.5;
        A[1][1] = 4.5;
        System.Console.WriteLine(A[0][0]);
        // Prints 1,5
        Console.Read();
        double[] B = A[0];
        System.Console.WriteLine(B[0]);
        // Prints 1,5
        System.Console.Read();
        System.Console.Read();

    }

所以行:double[] Arowi = A[i]; 将转换为 double[] Arowi = A[i];,完全一样。

只有 记得创建一个锯齿状数组 double[][] A 而不是像 double[,] A 这样的数组,因为似乎没有办法用不是锯齿状数组(A[m,n];double[] Arowi = A[i]; 不可能像 Java 那样完成)。我现在不能确切地说出为什么。刚刚在我的 VS2013 中试过。

我建议您查看 MSDN 文档:http://msdn.microsoft.com/en-us/library/aa288453%28v=vs.71%29.aspx

我也推荐你这个帖子:Multidimensional Array [][] vs [,]

了解一下

double[] Arowi = A[i];

意味着,最容易将 A 视为双精度数组而不是矩阵。因此,如果您索引 A,它将 return 一个双精度数组。此外,如果您在某个索引处索引 A,它将 return 加倍。

希望对您有所帮助!