如何在C#中构造具有所需属性的矩阵

时间:2015-06-25 06:16:45

标签: c# matrix

我需要构造一个具有((X.size)^ ncol)x ncol维度的矩阵。 其中X是数组,X.size是该数组的大小

ncol表示列数。

给出的输入是一个数组(比如“X”)和所需矩阵的列数(比如说“ncol”)。

我认为写下这些属性会产生混淆,所以我想用给定的输入给出一些所需矩阵的例子:

示例1:

输入:数组X = [1,2,3],所需的列数为2

然后我的输出应该是

    Var1 Var2
 [1,]    1    1
 [2,]    2    1
 [3,]    3    1
 [4,]    1    2
 [5,]    2    2
 [6,]    3    2
 [7,]    1    3
 [8,]    2    3
 [9,]    3    3

示例2:

输入:数组X = [1,2,3],所需的列数为3

     Var1 Var2 Var3
 [1,]    1    1    1
 [2,]    2    1    1
 [3,]    3    1    1
 [4,]    1    2    1
 [5,]    2    2    1
 [6,]    3    2    1
 [7,]    1    3    1
 [8,]    2    3    1
 [9,]    3    3    1
[10,]    1    1    2
[11,]    2    1    2
[12,]    3    1    2
[13,]    1    2    2
[14,]    2    2    2
[15,]    3    2    2
[16,]    1    3    2
[17,]    2    3    2
[18,]    3    3    2
[19,]    1    1    3
[20,]    2    1    3
[21,]    3    1    3
[22,]    1    2    3
[23,]    2    2    3
[24,]    3    2    3
[25,]    1    3    3
[26,]    2    3    3
[27,]    3    3    3

示例3:

输入:数组X = [1,2,3],所需的列数为1

那么期望的输出应该是

    [,1]
[1,]    1
[2,]    2
[3,]    3

有什么建议吗?

谢谢。

1 个答案:

答案 0 :(得分:1)

您基本上想要枚举给定数组中nCols个符号的所有组合。

通过以下观察可以很容易地完成:第一列中的元素重复一次。第二列中的元素重复symbols.Length次。在第三列symbols.Length^2等等。

然后可以在几个嵌套循环中填充此矩阵,如下所示:

// Calculate the needed number of rows
int nRows = (int)Math.Pow(symbols.Length, nCols);

// Allocate memory for the matrix
int[,] matrix = new int[nRows, nCols];

// The first column repeats elements exactly once
int repeatedElementsInCol = 1;

//Successively fill all columns
for (int col = 0; col < nCols; ++col)
{
    int row = 0;
    // Fill every row
    while(row < nRows)
    {
        // Write each symbol to the matrix ...
        foreach (var symbol in symbols)
            // ... with the specified number of repetitions
            for (int repetition = 0; repetition < repeatedElementsInCol; ++repetition)
                matrix[row++, col] = symbol;
    }

    // The next column repeats elements symbols.Length times as often
    repeatedElementsInCol *= symbols.Length;
}

这为nCols = 3symbols = { 1, 2, 3 }

提供了以下矩阵
1  1  1
2  1  1
3  1  1
1  2  1
2  2  1
3  2  1
1  3  1
2  3  1
3  3  1
1  1  2
2  1  2
3  1  2
1  2  2
2  2  2
3  2  2
1  3  2
2  3  2
3  3  2
1  1  3
2  1  3
3  1  3
1  2  3
2  2  3
3  2  3
1  3  3
2  3  3
3  3  3