F # Math.Net Matrix.mapRows для создания новой матрицы с другим размером - PullRequest
0 голосов
/ 14 ноября 2018

У меня есть функция, которая управляет Vector<float>, в результате чего получается новый Vector<float> с другой длиной, например, добавление числа перед вектором

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

Теперь я хочу применить этодля всех строк матрицы (2x2), и я ожидал бы матрицу (2x3), я попытался использовать Matrix.mapRows из MathNet.Numerics.LinearAlgebra, но это дает мне ошибку, что размер должен быть одинаковым.

Интересно, есть ли в MathNet какая-либо другая функция для отображения строк, которая приводит к матрице другого размера.

Спасибо.

1 Ответ

0 голосов
/ 14 ноября 2018

Кажется, вы пытаетесь продублировать первый столбец матрицы.Например:

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