我想将一个SQL表(比如i.2列:一个包含用户ID,一个包含用户年龄和ii.n行)只包含一个F#矩阵(相同维度)的整数。 我设法使用以下F#代码,但我确信这不是最有效的方法。
实际上,我发现维度化F#矩阵的唯一方法是使用MySQL创建2个具有单个值(行数和列数)的表,并将这些值传输到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
答案 0 :(得分:5)
如果您事先不知道矩阵的大小,有多种方法可以初始化矩阵。例如,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 library from F#,它具有更高效的矩阵类型。