如何将矩阵放入一个for循环数组中?

时间:2019-01-28 18:13:27

标签: c#

我正在尝试按特定顺序将矩阵的值放入数组中。矩阵为2*length,其中长度是用户选择的消息长度除以2。数组是整个长度。

我尝试使用for循环,其中将矩阵的前两个值([0,0]和[1,0])放入数组中。

Int[,] result = new int[2, length/2];
String[] resultArray = new string[length];
tracker = 0;

while (tracker < length) 
{
    for (int i = 0; i < length/2; i++)
    {
        resultArray[2*i] = Convert.ToString(result[0, i]);    
        resultArray[(2*i)+1] = Convert.ToString(result[1, i]);              
    }
    tracker++;
}

当我运行此代码时,我得到System.IndexOutOfRangeException:'索引在数组的边界之外。'错误信息。 for循环中的第二个表达式高亮显示。

我似乎无法意识到我做错了什么。 (2*i)+1 when i=(length/2-1)应该等于length-1,对吧?

3 个答案:

答案 0 :(得分:0)

不是一个明确的答案,但是比您的方法更能证明故障:要遍历可以使用的方阵

    var y = i / d 
    var x = i % d

其中d是数组的维度

int d = 2;
int length = d * d; // square matrix;
for (int i = 0; i < length; i++)
{

    // iterate trough the array via column -> row by row (or horizontal)
    int y = i / d;
    int x = i % d; // => i mod 2 (remnant of division by 2)
    resultArray[i] = Convert.ToString(result[x, y]);    
}

for (int i = 0; i < length; i++)
{

    // iterate trough the array via row -> column by column (or vertical)
    int x = i / d;
    int y = i % d;
    resultArray[i] = Convert.ToString(result[x, y]);    
}

答案 1 :(得分:0)

您实际上可以使用LINQ在矩阵上进行迭代。您只需要使用Cast<T>()来获取正确的IEnumerable接口,然后使用简单的Select。它将首先在第一个维度上进行迭代,然后在第二个维度内进行迭代。

如果我这样设置测试数据:

int[,] result = new int[2, 5];
result[0,0] = 00;
result[0,1] = 01;
result[0,2] = 02;
result[0,3] = 03;
result[0,4] = 04;
result[1,0] = 10;
result[1,1] = 11;
result[1,2] = 12;
result[1,3] = 13;
result[1,4] = 14;

然后这句话:

var resultArray1 = result.Cast<int>().Select( n => n.ToString("00")).ToArray();

将产生以下结果:

00
01
02  
03
04
10
11
12
13
14

如果您想先遍历第二维,可以编写一个简短的扩展方法:

public static IEnumerable<T> ToSingleDimension<T>(this T[,] source)
{
    for (int i=0; i<=source.GetUpperBound(1); i++)
    {
        for (int j=0; j<=source.GetUpperBound(0); j++)
        {
            yield return source[j,i];
        }
    }
}

并这样称呼它:

var resultArray2 = result.ToSingleDimension().Select( n => n.ToString("00")).ToArray();

将产生以下结果:

00
10
01
11
02
12
03
13
04
14

请参见DotNetFiddle上的示例。

答案 2 :(得分:-1)

您可以将 MathNet.Numerics 库与一些LINQ结合使用来实现所需的目标:

  

PM>安装包MathNet.Numerics

var result = new double[2,4]
{
    { 1,2,3,4 },
    { 5,6,7,8 },
};

var resultArray = Matrix
    .Build
    .DenseOfArray(result)
    .ToRowArrays()
    .SelectMany(q => q.ToArray().Select(w => w.ToString()))
    .ToArray();

如果初始数组的形状为[4,2]而不是[2,4],则可以使用ToColumnArrays()