F#Math.Net Matrix.mapRows创建具有不同大小的新矩阵

时间:2018-11-14 07:25:59

标签: f# mathnet

我有一个操作Vector<float>的函数,结果是一个新的Vector<float>,它的长度不同,一个例子是在向量前面附加一个数字

let addElementInfront (x:Vector<float>) =
    x.ToArray() 
    |> Array.append [|x.[0]|]
    |> vector

现在,我想将此方法应用于(2x2)矩阵的所有行,并且我希望使用(2x3)矩阵,我尝试使用Matrix.mapRows的{​​{1}},但是它给了我错误大小必须相同。

只想知道MathNet是否具有其他功能来映射导致大小矩阵不同的行。

谢谢。

1 个答案:

答案 0 :(得分:3)

似乎您正在尝试复制矩阵的第一列。例如:

1.0; 2.0         1.0; 1.0; 2.0
3.0; 4.0 becomes 3.0; 3.0; 4.0

如果这是真的,那么代码可能是:

let m = matrix [ [ 1.0; 2.0 ]
                 [ 3.0; 4.0 ] ]
m
|> Matrix.prependCol (m.Column 0)

更新

因为上面的假设不正确。

因此,您可以获取矩阵行的序列,然后像往常一样使用Seq.map对其进行转换,最后生成结果矩阵:

let transform f m =
    m
    |> Matrix.toRowSeq
    |> Seq.map f
    |> matrix

// or even shorter in F# idiomatic style:
let transform f =
    Matrix.toRowSeq >> Seq.map f >> matrix

// test

let addElementInFront (x : Vector<float>) =
    x.ToArray()
    |> Array.append [| x.[0] |]
    |> vector

matrix [ [ 1.0; 2.0 ]
         [ 3.0; 4.0 ] ]
|> transform addElementInFront