Labfans是一个针对大学生、工程师和科研工作者的技术社区。 论坛首页 | 联系我们(Contact Us)
MATLAB爱好者论坛-LabFans.com
返回   MATLAB爱好者论坛-LabFans.com > 其它 > 资料存档
资料存档 资料存档
 
 
主题工具 显示模式
旧 2019-12-10, 16:49   #1
poster
高级会员
 
注册日期: 2019-11-21
帖子: 3,006
声望力: 66
poster 正向着好的方向发展
帖子 F#的简单包装器,可以执行矩阵运算

这是一个相对较长的职位。 F#现在具有矩阵向量类型(在PowerPack中不在Core中)。这很棒!甚至Python的数值计算能力也来自第三部分。

但是那里提供的函数仅限于矩阵和矢量算法,因此要进行求逆,分解等。我们仍然需要使用另一个库。我现在正在使用最新的dnAnalytics ,它已合并到Math.Net项目中。但是Math.Net项目现在已经超过一年没有公开更新了,我不知道他们是否有继续计划。

我做了以下包装器,该包装器使用类似于Matlab的函数来完成简单的线性代数。由于我是F#和FP的新手,请您提出一些建议来改进包装程序和代码?谢谢!

#r @"D:\WORK\tools\dnAnalytics_windows_x86\bin\dnAnalytics.dll" #r @"FSharp.PowerPack.dll" open dnAnalytics.LinearAlgebra open Microsoft.FSharp.Math open dnAnalytics.LinearAlgebra.Decomposition // F# matrix -> ndAnalytics DenseMatrix let mat2dnmat (mat:matrix) = let m = new DenseMatrix(mat.ToArray2D()) m // ndAnalytics DenseMatrix -> F# matrix let dnmat2mat (dnmat:DenseMatrix) = let n = dnmat.Rows let m = dnmat.Columns let mat = Matrix.create nm 0. for i=0 to n-1 do for j=0 to m-1 do mat.[i,j] List.map (fun x-> ranlist m)) // is square matrix let issqr (m:matrix) = let n, m = m.Dimensions n = m // is postive definite let ispd m = if not (issqr m) then false else let m1 = mat2dnmat m let qrsolver = dnAnalytics.LinearAlgebra.Decomposition.Cholesky(m1) qrsolver.IsPositiveDefinite() // determinant let det m = let m1 = mat2dnmat m let lusolver = dnAnalytics.LinearAlgebra.Decomposition.LU(m1) lusolver.Determinant () // is full rank let isfull m = let m1 = mat2dnmat m let qrsolver = dnAnalytics.LinearAlgebra.Decomposition.GramSchmidt(m1) qrsolver.IsFullRank() // rank let rank m = let m1 = mat2dnmat m let svdsolver = dnAnalytics.LinearAlgebra.Decomposition.Svd(m1, false) svdsolver.Rank() // inversion by lu let inv m = let m1 = mat2dnmat m let lusolver = dnAnalytics.LinearAlgebra.Decomposition.LU(m1) lusolver.Inverse() // lu let lu m = let m1 = mat2dnmat m let lusolver = dnAnalytics.LinearAlgebra.Decomposition.LU(m1) let l = dnmat2mat (DenseMatrix (lusolver.LowerFactor ())) let u = dnmat2mat (DenseMatrix (lusolver.UpperFactor ())) (l,u) // qr let qr m = let m1 = mat2dnmat m let qrsolver = dnAnalytics.LinearAlgebra.Decomposition.GramSchmidt(m1) let q = dnmat2mat (DenseMatrix (qrsolver.Q())) let r = dnmat2mat (DenseMatrix (qrsolver.R())) (q, r) // svd let svd m = let m1 = mat2dnmat m let svdsolver = dnAnalytics.LinearAlgebra.Decomposition.Svd(m1, true) let u = dnmat2mat (DenseMatrix (svdsolver.U())) let w = dnmat2mat (DenseMatrix (svdsolver.W())) let vt = dnmat2mat (DenseMatrix (svdsolver.VT())) (u, w, vt.Transpose) 和测试代码

(* todo: read matrix market format ref: http://math.nist.gov/MatrixMarket/formats.html *) let readmat (filename:string) = System.IO.File.ReadAllLines(filename) |> Array.map (fun x-> (x |> String.split [' '] |> List.toArray |> Array.map float)) |> matrix let timeit f str= let watch = new System.Diagnostics.Stopwatch() watch.Start() let res = f() watch.Stop() printfn "%s Needed %f ms" str watch.Elapsed.TotalMilliseconds res let test() = let testlu() = for i=1 to 10 do let a,b = lu (randmat 1000 1000) () () let testsvd() = for i=1 to 10 do let u,w,v = svd (randmat 300 300) () () let testdet() = for i=1 to 10 do let d = det (randmat 650 650) () () timeit testlu "lu" timeit testsvd "svd" timeit testdet "det" 我也比较了Matlab

t = cputime; for i=1:10, [l,u] = lu(rand(1000,1000)); end; e = cputime-t t = cputime; for i=1:10, [u,w,vt] = svd(rand(300,300)); end; e = cputime-t t = cputime; for i=1:10, d = det(rand(650,650)); end; e = cputime-t 计时(Duo Core 2.0GH,2GB内存,Matlab 2009a)

f#: lu Needed 8875.941700 ms svd Needed 14469.102900 ms det Needed 2820.304600 ms matlab: lu 3.7752 svd 5.7408 det 1.2636 matlab快大约两倍。这是合理的,因为本机R也具有类似的结果


回答:
我认为dnmat2mat和randmat都可以通过使用Matrix.init简化:

let dnmat2mat (dnmat : DenseMatrix) = Matrix.init (dnmat.Rows) (dnmat.Columns) (fun ij -> dnmat.[i,j]) let randmat nm = let r = System.Random() Matrix.init nm (fun _ _ -> r.NextDouble())

更多&回答...
poster 当前离线   回复时引用此帖
 


发帖规则
不可以发表新主题
不可以发表回复
不可以上传附件
不可以编辑自己的帖子

启用 BB 代码
论坛禁用 表情符号
论坛启用 [IMG] 代码
论坛启用 HTML 代码



所有时间均为北京时间。现在的时间是 21:15


Powered by vBulletin
版权所有 ©2000 - 2025,Jelsoft Enterprises Ltd.