Перенос таблицы MySQL в матрицу F # - PullRequest
2 голосов
/ 07 октября 2011

Я хотел бы перенести таблицу SQL (скажем, i. 2 столбца: один содержит идентификатор пользователя, а другой - возраст пользователя и ii. N строк), содержащий только целые числа, в матрицу F # (те же измерения). Мне удается сделать это с помощью следующего кода F #, но я убежден, что это не самый эффективный способ сделать это.

Действительно, единственный способ измерения матрицы F # заключался в создании 2 таблиц с одним значением (количество строк и количество столбцов соответственно) с использованием MySQL и передаче этих значений в F #.

Можно ли импортировать таблицу mySQL в матрицу F # с кодом F #, который «распознает» размерность матрицы. По сути, я хотел бы функцию, которая принимает адрес таблицы в качестве аргумента и возвращает матрицу.

Вот мой код:

#r "FSharp.PowerPack.dll"
#r "Microsoft.Office.Interop.Excel"
open System
open System.Data
open System.Data.SqlClient
open Microsoft.Office.Interop
open Microsoft.FSharp.Math
open System.Collections.Generic

//Need of three types : User, number of rows and number of columns
type user = {
    ID :  int;
    Age : int;} 


type nbrRows = {NbreL : int ;} 

type nbrCol = {NbreC : int ;}

// I. Import the SQL data into F#
// I.1. Import the number of rows of the table into F#

  let NbrRows = seq { 

  use cnn = new SqlConnection(@"myconnection; database=MyDataBase; integrated security=true")
  use cmd1 = new SqlCommand("Select * from theTablesWhichContainsTheNumberOfRows", cnn)


  cnn.Open()
  use reader = cmd1.ExecuteReader()
  while reader.Read() do
    yield {
        NbreL = unbox(reader.["Expr1"])
    }
}

let NbrRowsList = NbrRows |> Seq.toList // convert the sequence into a List


// I.2. Same code to import the number of columns of the table

let NbrCol = seq { 

  use cnn = new SqlConnection(@"MyConnection; database=myDatabase; integrated security=true")
  use cmd1 = new SqlCommand("Select * from theTablesWhichContainsTheNumberOfColumns", cnn)


  cnn.Open()
  use reader = cmd1.ExecuteReader()
  while reader.Read() do
    yield {
        NbreC = unbox(reader.["Expr1"])
    }
}

let NbrColsList = NbrCol |> Seq.toList

// Initialisation of the Matrix

let matrixF = Matrix.create NbrRowsList.[0].NbreL NbrColsList.[0].NbreC  0.

//Transfer of the mySQL User table into F# through a sequence as previously

let GetUsers = seq { 

  use cnn = new SqlConnection(@"myConnection, database=myDatabase; integrated security=true")
  use cmd = new SqlCommand("Select * from tableUser ORDER BY ID", cnn)


  cnn.Open()
  use reader = cmd.ExecuteReader()
  while reader.Read() do
    yield {
        ID = unbox(reader.["ID"])
        Age = unbox(reader.["Age"])
    }
}

// Sequence to list

let UserDatabaseList = GetUsers |> Seq.toList

// Fill of the user matrix 

for i in 0 .. (NbrRowList.[0].NbreL - 1) do    
    matrixF.[0,i] <- UserDatabaseList.[i].ID |> float
    matrixF.[1,i] <- UserDatabaseList.[i].Age|> float 
matrixUsers

1 Ответ

5 голосов
/ 07 октября 2011

Существуют различные способы инициализации матрицы, если вы заранее не знаете ее размер.Например, Matrix.ofList берет список списков и автоматически вычисляет размер.

Если у вас есть только UserDatabaseList (который вы можете создать, не зная количества строк и столбцов), то вы должны написать:

Matrix.ofList
  [ // Create list containing rows from the database
    for row in UserDatabaseList do
      // For each row, return list of columns (float values)
      yield [ float row.ID; float row.Age ] ]

В стороне - матрица F #действительно полезно в основном, если вы собираетесь выполнять некоторые матричные операции (и даже тогда, это не самый эффективный вариант).Если вы выполняете некоторую обработку данных, тогда может быть проще хранить данные в обычном списке.Если вы занимаетесь какой-то серьезной математикой, то вы можете проверить, как использовать библиотеку Math.NET из F # , которая имеет более эффективный тип матрицы.

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