F# Math.Net Matrix.mapRows для создания новой матрицы разного размера.

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

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

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

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

Спасибо.


person Jose Vu    schedule 14.11.2018    source источник


Ответы (1)


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

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
person Nghia Bui    schedule 14.11.2018
comment
привет Nghia, спасибо за ваш комментарий. Случай, который я изложил, является просто примером того, что функция преобразует размер вектора, он не должен быть точным. Мой вопрос состоял в том, чтобы найти функцию mapRows, которая сопоставляет эту функцию Vector<float>->Vector<float> с Matrix<float>->Matrix<float>, где матрица результата имеет размер, отличный от исходного. - person Jose Vu; 14.11.2018
comment
ничего себе, это работает как шарм, я не знал toRowsSeq, также не знал, что seq.map может применяться к вектору. Спасибо бро, я отметил твой комментарий как ответ - person Jose Vu; 15.11.2018