簡體   English   中英

C#到F#:在F#中創建和使用float [] []

[英]C# to F#: Creating and using a float[][] in F#

我在C#中使用這種簡單的神經網絡方法:

  private void InitNeurons()
    {
        //Neuron Initilization
        List<float[]> neuronsList = new List<float[]>();

        for (int i = 0; i < _layers.Length; i++) //run through all layers
        {
            neuronsList.Add(new float[_layers[i]]); //add layer to neuron list
        }

        _neurons = neuronsList.ToArray(); //convert list to array
    }

我怎么在F#中這樣做? 我覺得它可能更簡單。 也許是這樣的?

namespace NeuralNetwork

type NeuralNetworkF(layers : int[]) = 
    member this.Layers = layers
    member this.Neurons : float[][] = [| for layer in layers do new float[]|]

這會導致F#中的編譯器錯誤。 我想取int數組“_layers”的大小,並為每個值迭代並將該值添加到F#中的Neurons成員。

您嘗試創建數組的方式new float[]在F#中不是有效的語法。 數組的正確語法是[| 1; 2; 3 |] [| 1; 2; 3 |] [| 1; 2; 3 |] ,或者對於空數組,它只是[| |] [| |] 不需要指定元素的類型,編譯器將從上下文中推斷出它。 但是如果你真的想要顯式,你仍然可以通過冒號指定類型,就像你可以使用任何表達式: [| |] : float[] [| |] : float[]

但是,無論如何,這對你來說都是無用的,因為你要做的不是創建一個包含已知元素的數組,而是創建一個已知長度的數組。 為此,有一些函數,這里對你有用的是Array.create 它需要兩個參數 - 大小和值, - 它返回一個該大小的數組,其中每個元素都是該值。

type NeuralNetworkF(layers : int[]) = 
    member this.Layers = layers
    member this.Neurons : float[][] = [| for layer in layers -> Array.create layer 0.0 |]

請注意,在上面的代碼我也更換do-> 這是你遇到的第二個問題。 你看, do執行一個“動作”,它不一定會產生一個項目,例如:

let xs = [ for n in 1..10 do 
             if n > 5 then yield n ]

這將產生一個數字610的列表 - 而不是110 - 因為它只在n > 5時產生一個元素。 yield關鍵字是產生元素的原因。 所以,如果你想生產代碼中的每一層的數組,你必須yield該數組:

[| for layer in layers do yield Array.create layer 0.0 |]

這有效,但有一個捷徑:箭頭->代表do yield ,所以你可以使用它。

[| for layer in layers -> Array.create layer 0.0 |]

最后 ,給你一個問題:你真的需要上課嗎? 課程非常狡猾,時間很長,所以除非你有充分的理由,否則我建議你去錄音。

很好的解釋,@ FyodorSoikin,但以下可能更好:

let newNeuralNetwork (layers : _ []) =
    fun i -> Array.zeroCreate<float> layers.[i]
    |> Array.init layers.Length

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM