I have a matrix. And I need to get 1D arrays from my matrix. For example, I have follow matrix:
123
456
789
So it looks like 3 arrays: 147, 258, 369. But I got "Index out of range exception" in this code:
我有一个矩阵。我需要从我的矩阵中获取一维数组。例如,我有跟随矩阵:123 456 789所以它看起来像3个数组:147,258,369。但是我在这段代码中得到了“索引超出范围异常”:
int[] b = new int[n];
for (i = 0; i < n; i++)
{
b[i] = a[i, n];
Console.Write(b[i] + " ");
}
Console.WriteLine();
Thanx for any help.
Thanx任何帮助。
Here's full code that works already:
这里的完整代码已经有效:
static void Main(string[] args)
{
int n = 0, m = 0, i = 0, j = 0;
Random r = new Random();
Console.WriteLine("Please, input matrix size:");
Console.Write("\tn = ");
n = Convert.ToInt32(Console.ReadLine());
Console.Write("\tm = ");
m = Convert.ToInt32(Console.ReadLine());
Console.WriteLine();
int[,] a = new int[n, m];
for (i = 0; i < n; i++)
{
for (j = 0; j < m; j++)
{
a[i, j] = r.Next(0, 2);
}
}
showMe(a, n, m);
Console.WriteLine();
run(a, n, m);
Console.ReadKey();
int[][] b = new int[m][];
for (i = 0; i < m; i++)
{
b[i] = new int[n];
for (j = 0; j < n; j++)
{
b[i][j] = a[j, i];
Console.Write(b[i][j] + " ");
}
Console.WriteLine();
}
Console.WriteLine();
Console.ReadKey();
}
3 个解决方案
#1
2
I'll assume n=3 and that it is a square matrix, a[i, n];
will be outside the bounds of a - the largest index you can reference is n-1.
我假设n = 3并且它是一个方阵,a [i,n];将超出a的范围 - 您可以引用的最大索引是n-1。
I think what you want is
我想你想要的是什么
int[][] b = new int[m][];
for (i = 0; i < m; i++)
{
b[i] = new int[n];
for (j = 0; j < n; j++)
{
b[i][j] = a[j,i];
}
}
b[0] is your first array, b[1] is your second....
b [0]是你的第一个阵列,b [1]是你的第二个......
#2
1
Try this:
int n = 3;
int[,] a = new int[,] {
{ 1, 2, 3 },
{ 4, 5, 6 },
{ 7, 8, 9 } };
int[] b = new int[n];
for (int i = 0; i < n; i++)
{
b[i] = a[i, n - 1];
Console.Write(b[i] + " ");
}
Console.ReadLine();
This will output 3 6 9 since n is not being changed. Jimmy is correct, a[i,n] needs to be a[i, n-1].
这将输出3 6 9,因为n未被更改。吉米是对的,[i,n]需要是[i,n-1]。
#3
1
This works for two-dimensional arrays in general.
这通常适用于二维数组。
public static T[][] ToJaggedArray<T>(this T[,] arr)
{
return Enumerable.Range(0, arr.GetUpperBound(0) + 1)
.Select(i => Enumerable.Range(0, arr.GetUpperBound(1) + 1)
.Select(j => arr[i, j])
.ToArray())
.ToArray();
}
public static T[][] ToJaggedArrayTranspose<T>(this T[,] arr)
{
return Enumerable.Range(0, arr.GetUpperBound(1) + 1)
.Select(j => Enumerable.Range(0, arr.GetUpperBound(0) + 1)
.Select(i => arr[i, j])
.ToArray())
.ToArray();
}
// you'd be interested in ToJaggedArrayTranspose()
var mat = new[,]
{
{1, 2, 3},
{4, 5, 6},
{7, 8, 9},
};
var arr = mat.ToJaggedArrayTranspose();
// arr === new[][] { new[] {1, 4, 7}, new[] {2, 5, 8}, new[] {3, 6, 9} }
p.s., Always use GetUpperBound()
on multi-dimensional arrays to get the length of the dimensions, don't try to guess it.
p.s.,总是在多维数组上使用GetUpperBound()来获取维度的长度,不要试图猜测它。
#1
2
I'll assume n=3 and that it is a square matrix, a[i, n];
will be outside the bounds of a - the largest index you can reference is n-1.
我假设n = 3并且它是一个方阵,a [i,n];将超出a的范围 - 您可以引用的最大索引是n-1。
I think what you want is
我想你想要的是什么
int[][] b = new int[m][];
for (i = 0; i < m; i++)
{
b[i] = new int[n];
for (j = 0; j < n; j++)
{
b[i][j] = a[j,i];
}
}
b[0] is your first array, b[1] is your second....
b [0]是你的第一个阵列,b [1]是你的第二个......
#2
1
Try this:
int n = 3;
int[,] a = new int[,] {
{ 1, 2, 3 },
{ 4, 5, 6 },
{ 7, 8, 9 } };
int[] b = new int[n];
for (int i = 0; i < n; i++)
{
b[i] = a[i, n - 1];
Console.Write(b[i] + " ");
}
Console.ReadLine();
This will output 3 6 9 since n is not being changed. Jimmy is correct, a[i,n] needs to be a[i, n-1].
这将输出3 6 9,因为n未被更改。吉米是对的,[i,n]需要是[i,n-1]。
#3
1
This works for two-dimensional arrays in general.
这通常适用于二维数组。
public static T[][] ToJaggedArray<T>(this T[,] arr)
{
return Enumerable.Range(0, arr.GetUpperBound(0) + 1)
.Select(i => Enumerable.Range(0, arr.GetUpperBound(1) + 1)
.Select(j => arr[i, j])
.ToArray())
.ToArray();
}
public static T[][] ToJaggedArrayTranspose<T>(this T[,] arr)
{
return Enumerable.Range(0, arr.GetUpperBound(1) + 1)
.Select(j => Enumerable.Range(0, arr.GetUpperBound(0) + 1)
.Select(i => arr[i, j])
.ToArray())
.ToArray();
}
// you'd be interested in ToJaggedArrayTranspose()
var mat = new[,]
{
{1, 2, 3},
{4, 5, 6},
{7, 8, 9},
};
var arr = mat.ToJaggedArrayTranspose();
// arr === new[][] { new[] {1, 4, 7}, new[] {2, 5, 8}, new[] {3, 6, 9} }
p.s., Always use GetUpperBound()
on multi-dimensional arrays to get the length of the dimensions, don't try to guess it.
p.s.,总是在多维数组上使用GetUpperBound()来获取维度的长度,不要试图猜测它。