2016-07-03 6 views
2

ないDenseMatrixタイプを移入する方法がわから:DenseMatrix無効割り当て

let rows = [|for line in File.ReadAllLines("Z:\\mypath.csv") 
      |> Seq.skip 1 do yield line.Split(',') |> Array.map float|] 
let data = DenseMatrix.ofRowArrays rows 
let mutable data_logdiff = DenseMatrix.zero<float> (data.RowCount-1) (data.ColumnCount) 

for i in [0 .. data.ColumnCount-1] do 
    for j in [1 .. data.RowCount-1] do 
     data_logdiff.At(j-1, i) <- data.At(j, i)/data.At(j-1, i) |> log 

最後の行は、エラー「無効な割り当て」を生成します。

上記の論理を表現する機能的な方法があるかどうかも知りたいですか。

ありがとうございました。

+6

あなたはどのライブラリを使用しているのか、開いている名前空間を誰でも知っていると仮定しないでください。 – Gustavo

答えて

6

あなたはMathNetを使用していると仮定しますが、どのバージョンがわからないのですか?

まず、私はあなたのdata_logdiffが変更可能である必要はないと考えています。それはすでに変更可能なプロパティを持つオブジェクトです。オブジェクト自体ではなくそのプロパティを変更したいということです。

は、次に、あなたのコードに問題はあなたがそれらのプロパティを変異させる方法を、あなただけの値を返します代わりに .Atのインデクサーを使用する必要があります:

#r @"packages\MathNet.Numerics.3.8.0\lib\net40\MathNet.Numerics.dll" 
#r @"packages\MathNet.Numerics.FSharp.3.8.0\lib\net40\MathNet.Numerics.FSharp.dll" 

open System.IO 
open MathNet.Numerics.LinearAlgebra 

let rows = [|for line in File.ReadAllLines("Z:\\mypath.csv") 
     |> Seq.skip 1 do yield line.Split(',') |> Array.map float|] 
let data = DenseMatrix.ofRowArrays rows 
let data_logdiff = DenseMatrix.zero<float> (data.RowCount-1) (data.ColumnCount) 

for i in [0 .. data.ColumnCount-1] do 
    for j in [1 .. data.RowCount-1] do 
     data_logdiff.[j-1, i] <- data.At(j, i)/data.At(j-1, i) |> log 

ようにするには、それ以上の機能を使用DenseMatrix.initの代わりに、DenseMatrix.zeroと行列を初期化するために

let data_logdiff = 
    DenseMatrix.init 
     (data.RowCount-1) 
     (data.ColumnCount) 
     (fun j i -> if j = 0 then 0. else data.At(j, i)/data.At(j-1, i) |> log) 

一般的に言って、あなたが.zero使用毎回、ループをまたはベクターが.init functiを使用して検討します。その後、ループ代わりに、それはループの本体のようなものである追加のパラメータをとります。

+0

非常に滑らかです。ありがとう。 –

関連する問題