从以下代码:
/** 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;
}
答案 0 :(得分:2)
这条线在做什么?
将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是二维矩阵,为什么允许A [i]?
因为如您所见,您将一维数组值(B || Arowi)设置为包含A [i]数组的第二维。
想象一下A [i]本身包含另一个数组(bidimensional)。所以我们将这个维度保存到一个新变量中。在这种情况下,它将引用内存地址,而不是值本身,如果我没有混淆,并且如果你编辑Arowi || B中的值,它将在原始数组中更改。
示例:
B[0] == 1.5 == TRUE
B[0] = 1.75
A[0][0] == 1.5 == FALSE
A[0][0] == 1.75 == TRUE
它究竟在做什么?
我在示例中解释了它。
如果我没有混淆,应用程序正在执行以下操作:
它保存了添加(加上操作,s += Arowi[k]*Bcolj[k]
)乘以A数组的值的结果(类(A)中的当前数组成员/属性,或者它可能是Matrix类本身,我看不到所有代码)由B列的值(参数采用的Matrix对象)。在每个主循环中,它通过B中的新列,存储该列中的所有行值,然后循环整个A数组或类数组,将结果存储在C中,然后将其作为Matrix对象返回。我希望这是可以理解的,我并不困惑。
与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
这样的数组,因为似乎没有办法引用没有锯齿状数组的维度({ {1}} A[m,n];
无法像在Java中那样完成。我现在还不知道为什么。刚试过我的VS2013。
我建议您查看MSDN文档:http://msdn.microsoft.com/en-us/library/aa288453%28v=vs.71%29.aspx
我也建议你这个帖子:Multidimensional Array [][] vs [,]
答案 1 :(得分:0)
不确定它在C#(.NET)中是怎么回事,但java没有两个(多)维数组。它只有数组(数组数组......)。因此,可以使用非矩形数组阵列。
double[] Arowi = A[i];
表示声明类型为Arowi
的名为array of doubles
的新变量,并将其设置为A[i]
,A
是{{1}的第i个(从零开始)成员}。
它与A[i][0]
不同,因为这是A
的第i个成员的第0个成员。
答案 2 :(得分:0)
了解
double[] Arowi = A[i];
意味着,最简单的方法是将A
视为双精度数组而不是矩阵。因此,如果您索引A
,它将返回一个双精度数组。此外,如果您在某个索引处索引A
,它将返回一个双精度。
希望这有帮助!