DenseMatrix 无效赋值
DenseMatrix invalid assignment
不确定如何填充 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
最后一行产生错误 "invalid assignment"。
也想知道是否有函数式的方式来表达上面的逻辑。
谢谢。
我假设您使用的是 MathNet,不知道是哪个版本。
首先,我认为您的 data_logdiff
不需要是可变的,它已经是一个具有可以改变属性的对象,我的意思是您想要改变它的属性,而不是对象本身。
然后你的代码中的问题是你如何改变那些 属性,你应该使用索引器而不是 .At
,这将 return 只有值:
#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
函数,它需要一个额外的参数,类似于循环。
不确定如何填充 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
最后一行产生错误 "invalid assignment"。
也想知道是否有函数式的方式来表达上面的逻辑。
谢谢。
我假设您使用的是 MathNet,不知道是哪个版本。
首先,我认为您的 data_logdiff
不需要是可变的,它已经是一个具有可以改变属性的对象,我的意思是您想要改变它的属性,而不是对象本身。
然后你的代码中的问题是你如何改变那些 属性,你应该使用索引器而不是 .At
,这将 return 只有值:
#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
函数,它需要一个额外的参数,类似于循环。