MathNet中的广播操作

时间:2016-07-03 18:01:18

标签: f# mathnet

[编辑整个问题以使其自包含]

假设我有以下数据:

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.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)

let alpha = vector [for i in data_logdiff.EnumerateColumns() -> i |> Statistics.Mean]

let sigsq (values:Vector<float>) (avg: float) =
    let sqr x = x * x
    let result = values |> (fun i -> sqr (i - avg))
    result

sigsq (data_logdiff.Column(i), alpha.[0]) |> printfn "%A"

以下是代码:

The type ''a * 'b' is not compatible with the type 'Vector<float>'

错误:@if (Request::has('wordsRow')) <header><h3>{{Request::get('wordsRow')}}</h3></header> @endif

这是矩阵和矢量之间的广播操作。所有这些杂技在matlab中做一个简单的意思((y-alpha)。^ 2)。 感谢。

1 个答案:

答案 0 :(得分:0)

你的代码中有一个错误,而F#编译器抱怨它,尽管有点模糊。你定义你的功能:

WITH Table1 AS (
SELECT  PersonID
        ,Split.a.value('.', 'VARCHAR(100)') Products
FROM   
    (SELECT PersonID
            ,Cast ('<X>' + Replace(Products, '|', '</X><X>') + '</X>' AS XML) AS Data
    FROM    @t1
    ) AS t CROSS APPLY Data.nodes ('/X') AS Split(a) 
), Table2 AS (
SELECT  PersonID
        ,Split.a.value('.', 'VARCHAR(100)') Products
FROM   
    (SELECT PersonID
            ,Cast ('<X>' + Replace(Products, '|', '</X><X>') + '</X>' AS XML) AS Data
    FROM    @t2
    ) AS t CROSS APPLY Data.nodes ('/X') AS Split(a) 
)
SELECT t1.PersonID 
FROM Table1 t1
WHERE NOT EXISTS (SELECT 1 
                  FROM Table2 t2
                  WHERE t1.PersonID = t2.PersonID 
                  AND t1.Products = t2.Products)
UNION  
SELECT t2.PersonID 
FROM Table2 t2
WHERE NOT EXISTS (SELECT 1 
                  FROM Table1 t1
                  WHERE t1.PersonID = t2.PersonID 
                  AND t1.Products = t2.Products)

这是一个带有两个参数的函数。 (实际上它是一个接受一个参数的函数,返回另一个参数的函数。)但是你这样称呼它:

let sigsq (values:Vector<float>) (avg: float) =

你对参数进行了元组化,对于F#函数(a,b)是一个参数,它是一个元组。你应该像这样调用你的函数:

sigsq (data_logdiff.Column(i), alpha.[0]) |> printfn "%A"

sigsq (data_logdiff.Column(0)) (alpha.[0]) 

和我最喜欢的一个:

sigsq <| data_logdiff.Column(0) <| alpha.[0]

我在代码中将data_logdiff.Column(0) |> sigsq <| alpha.[0] 替换为0。如果要循环,可以映射列:

(i)