あなたは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を使用して検討します。その後、ループ代わりに、それはループの本体のようなものである追加のパラメータをとります。
あなたはどのライブラリを使用しているのか、開いている名前空間を誰でも知っていると仮定しないでください。 – Gustavo