Предполагаю, что вы используете 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