如何声明一个 Array,其维度由另一个 int[] 数组指定。喜欢 float[int[]]?

How to declare an Array with its dimensions specified by another int[] array. Like float[int[]]?

提问人:Lucas Napon 提问时间:10/25/2023 更新时间:11/11/2023 访问量:59

问:

我正在用 C# 创建一个用于机器学习的 API,以更好地了解它们的工作原理。为简单起见,我使用的名称与 Keras 使用的名称相同。

在我的项目中,每个都需要指定其 和 。例如,如果图层接收到 10x10 的图像,则其输入大小为 。这作为 Layer 构造函数的参数传递,输出大小也是如此。LayerinputSizeoutputSizenew List<int>{10, 10}

在尝试创建层(完全连接)时,我发现将输入大小限制为单个数组维度更简单,因为权重可以声明为 .但是,如果我想将多维矩阵连接为输入,并保留其某些格式作为输出,该怎么办? 结果应与之前展平数组和之后反向展平数组相同。在我的模型中,这需要 3 层!Densefloat[][] _weights = new float[OutputSize[0]][]

    public Dense(List<int> inputSize, List<int> outputSize)
    {
        if (inputSize.Count != 1 || outputSize.Count != 1)
        {
            throw new Exception("Input size and output sizes must have only 1 dimension; inputSize has " +
                                inputSize.Count + " and outputSize has " + outputSize.Count);
        }
        Random rng = new();
        this.InputSize = inputSize;
        this.OutputSize = outputSize;
        this._weights = new float[this.OutputSize[0]][];
        this._biases = new float[this.OutputSize[0]];

        for (int i = 0; i < this.OutputSize[0]; i++)
        {
            this._weights[i] = new float[this.InputSize[0]];
            for (int j = 0; j < this.InputSize[0]; j++)
            {
                this._weights[i][j] = (float)(rng.NextDouble()*2-1);
            }
        }
    }  

我的代码的其余部分已经泛化为多维,因此此构造函数是唯一的瓶颈。 先谢谢你。Array

C# 数组

评论

0赞 shingo 10/25/2023
float[][]称为锯齿状数组,多维数组称为。我不明白你想实现什么,对于标题,.net 有一个 Array.CreateInstance 方法,它接受一个 int 数组作为每个维度的大小。float[,], float[,,], etc.
3赞 Dmitry Bychenko 10/25/2023
int[] dimensions = new int[] {3, 4, 5}; var result = Array.CreateInstance(typeof(float), dimensions);创建多维数组(这里是长度为 3、宽度为 4、高度为 5 的 3D 数组)

答:

0赞 Lucas Napon 11/11/2023 #1

正如 Dmitry Bychenko 在此评论中回答的那样,假设是在 C# 中实现的,如下所示:float[int[]]

var result = Array.CreateInstance(typeof(float), dimensions);

是 类型的数组。dimensionsint[]

评论

0赞 Ben Voigt 11/11/2023
此处的强制警告:没有静态类型信息,因此在运行时之前无法捕获类型错误。