2016-07-03 3 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

Очень гладкий. Благодарю. –

 Смежные вопросы

  • Нет связанных вопросов^_^