F #: как создать матрицу элементов любого другого типа, кроме Double - PullRequest
2 голосов
/ 25 марта 2010

Я новичок в F #. Я знаю, что есть способ создать Double Matrix с помощью PowerPack.dll:

let B = matrix [ [ 1.0; 7.0 ];
                 [ 1.0; 3.0 ] ]

Как создать матрицу с элементами моего собственного типа (например, с [,] вместо Double), чтобы она выглядела так:

let B = matrix [ [ [1,2]; [3,4] ];
                 [ [7,8]; [5,6] ] ]

Ответы [ 3 ]

9 голосов
/ 25 марта 2010

Я согласен, что матрица должна использоваться в основном при работе с числами. Стандартный неуниверсальный тип матрицы (который можно создать с помощью функции matrix) работает с числами типа float. Если вы хотите работать с другими числовыми типами, вы можете использовать модуль Matrix.Generic, который содержит функциональные возможности для работы с универсальными матрицами (содержащими любые типы).

Вы также можете использовать общую матрицу для хранения кортежей (если хотите). Общая матрица может быть создана с помощью функции ofList. Вы также можете определить функцию для этого, чтобы получить лучший синтаксис:

let anymatrix = Matrix.Generic.ofList
let B = anymatrix [ [ [1,2]; [3,4] ]; 
                    [ [7,8]; [5,6] ] ]

Для работы с общими матрицами вы можете использовать модуль Matrix.Generic:

let Bt = Matrix.Generic.transpose B

Как правило, вы будете использовать матрицы только с числовыми типами, потому что для работы многих операций требуется некоторая арифметика. Это будет работать для всех основных числовых типов (таких как int), и вы также можете предоставить арифметику для своего собственного типа, используя GlobalAssociations , обсуждаемый здесь .

Однако, если вы хотите просто сохранить некоторые значения, существуют другие (более подходящие) типы данных. Вы также можете использовать Array2D, который представляет изменяемый двумерный массив.

4 голосов
/ 26 марта 2010

Томас уже дает хороший ответ. Я немного прокомментирую здесь.

Давайте посмотрим некоторый исходный код в matrix.fsi из PowerPack:

type matrix = Matrix<float>

поэтому матрица - это конкретный тип, созданный из мета-типа Matrix. Вы также можете использовать

type intmatrix = Matrix<int>

чтобы определить тип вашей матрицы int.

но использовать что-то вроде:

let B = matrix [ [ 1.0; 7.0 ];
                 [ 1.0; 3.0 ] ]

Нам нужна еще одна функция, называемая матрицей, замедление которой равно

val matrix : seq<#seq<float>> -> matrix

посмотрим его реализацию в matrix.fs:

let matrix ll = Microsoft.FSharp.Math.Matrix.ofSeq ll

в то время как модуль Microsoft.FSharp.Math.Matrix предназначен для двойной (в f # float) матрицы, Microsoft.FSharp.Math.Matrix.Generics - для общей матрицы Вы можете реализовать свой intmatrix 'constructor'.

собрать это вместе:

type intmatrix = Matrix<int>
let intmatrix ll = Matrix.Generic.ofSeq  ll
let C = intmatrix [ [1;2]; [3;4] ];
2 голосов
/ 25 марта 2010

Matrix - особенно математический тип для работы с числами .

Если вы просто хотите расположить произвольные элементы в прямоугольную форму, используйте стандартные F # list s или array s.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...