F#与数学(II) – 在图形算法中使用矩阵(PartII)

F-Sharp:以F#实现的所有算法 算法-F# 该存储库包含出于教育目的在F#中实现的算法和数据结构。 概述 贡献 您可以为该存储库做出愉快的贡献。 请确定此存储库的目录结构和总体代码样式。 如果您想提出问题或提出建议,请打开一个问题。 立即下载

使用矩阵

Matrix是一种可变类型,因此它可以在创建后被修改。当你必须要修改矩阵式,最好的方法就是一次性的修改,修改后将之视为不可变的(例如:当矩阵作为函数结果被返回时,而此函数是使用可变性来实现的)。这样的话,你会在构造是得到好的性能,同时你可以保持代码的其余部分透明地引用它。

 

用序号访问矩阵元素

下面的代码展示了直接创建一个4x4的邻接矩阵的方法,此邻接矩阵来自于本文介绍部分所讨论的表示图的两个矩阵(尽管后面我们会看到一种更简单的方法来作这个):

 1: let m = Matrix.zero 4 4
 2: val m : matrix = matrix [ ... ]
 3:
 4: m.[0, 0] <- m1.[0, 0]
 5: val it : unit = ()
 6:
 7: for i in 0 .. 2 do
 8:   for j in 0 .. 2 do
 9:     m.[i+1, j+1] <- m2.[i, j]
 10: val it : unit = ()
 11:
 12: m
 13: val it : matrix = matrix [ [1.0; 0.0; 0.0; 0.0]
 14:                            [0.0; 0.0; 1.0; 1.0]
 15:                            [0.0; 1.0; 0.0; 0.0]
 16:                            [0.0; 1.0; 0.0; 1.0] ]

第一行代码创建了一个4x4大小的矩阵,矩阵的元素初始化为0.0。接下来,我们复制了矩阵m1和m2(前面段落中定义的)中的内容.矩阵m1只包含了一个元素,因此我们直接赋值了。在复制m2中的元素时,我们需要使用两个嵌套的for循环。元素一旦被复制完,我们就使用F# Interactive 将m的值打印出来。就像你看到的一样,创建好的矩阵和在介绍部分创建的矩阵是一样的。

 

来看看另一个与直接操作矩阵元素有关的示例,让我们写些代码来返回代表此图边的一个List。这个可以通过搜索矩阵中值为1.0来完成。注意:我们只需要搜索位于对角线下方的三角形即可(包括对角线),因为此矩阵是对称的:

 1: [ for i in 0 .. 3 do
 2:     for j in 0 .. i do
 3:       if (m.[i, j] = 1.0) then
 4:         yield i, j ]
 5: val it : (int * int) list = [(0, 0); (2, 1); (3, 1); (3, 3)]

嵌套循环的上界被限制在变量i当前的值,如此我们就可以从矩阵的左边搜索到对角线。如果矩阵中的一个元素包含1.0,我们就返回指定此边的两个顶点。

在前面章节中用来复制元素而使用的嵌套循环,其实没必要这么复杂的。下面的部分展示了切割法,此方法提供了一个用来解决此问题的一个更好的方法。

 

使用切割法访问矩阵的各部分

切割法相当于目录搜索,但是却不是指定某个单独的元素,它允许我们指定一个范围。其结果是包含原矩阵部分元素的矩阵。切割法不仅仅可以被使用在读取部分矩阵上,同样也可以用来用一个矩阵来代替此矩阵的部分。

例如,删除原图中的标号为4的边,我们可以只拿原矩阵的前三列和前三行即可实现:

 1: m.[0 .. 2, 0 .. 2]
 2: val it : Matrix<float> = matrix [ [1.0; 0.0; 0.0]
 3:                                   [0.0; 0.0; 1.0]
 4:                                   [0.0; 1.0; 0.0] ]

使用切割法的语法和使用目录法来获取矩阵元素相似。唯一的区别在于需要提供一个范围,如:0 .. 2,而不是仅仅一个序号。获取切片后的结果会是一个有此切割法得到的指定的矩阵。如果我们仔细看看其结果,我们可以看到一个拥有3个顶点2条边的图,此图是通过删除原图的第四条边得到的(一条边由顶点1到顶点1,另一条则是连接顶点2和3)。

 

切割法同样可以被使用在修改矩阵上。下面的例子展示了一种为整副图构造邻接矩阵的一种更优雅地方式,此邻接矩阵来自此图的两个不相连的邻接矩阵。

 1: let m = Matrix.zero 4 4
 2: m.[0 .. 0, 0 .. 0] <- m1
 3: m.[1 .. 3, 1 .. 3] <- m2

在第一个赋值运算中,这个范围描述了一个大小为1x1的矩阵,在第二个赋值运算中,我们重写了这个矩阵,将之赋为3x3的大小。如果给定的范围超出了矩阵的大小,我们会得到一个异常.同时,我们也要注意m.[0,0]和m.[0..0,0..0]之间有很大的区别。在第一种写法中,我们只能获取一个元素,因此这个表达式的类型是float。在第二种写法中,我们可以获取矩阵的一部分元素,这里只是碰巧只包含一个元素罢了。不过此表达式的类型仍然是matrix(矩阵)。

 

矩阵之间的运算

接下来,我们会看看一些在F# PowerPack中可用的矩阵间的标准运算操作。就像创建矩阵函数一样,这里我们将要讨论的操作均位于Matrix模块中。下面的代码演示了最开始的两个操作:

 1: m = Matrix.transpose m
 2: val it : bool = true
 3:
 4: Matrix.trace m
 5: val it : float = 2.0

第一个命令测试了矩阵m的转置是否合原矩阵相同。其结果是true,因为此矩阵是对称的(至少对于无向图来说都是对称的,意思是从顶点1岛2的边与从顶点2到1的边是相同的).

第二条命令用来计算所谓的矩阵的迹,即对角线上元素的和.当计算邻接矩阵时,它返回既是起点又是终点的顶点个数。在这里,其结果为2,由于在序号为[0,0]与[3,3]上有一个值为1.0,这就相当于有边分别从顶点1到1和顶点3到3。

 

下面的例子用来计算矩阵中边的条数。如果矩阵式对称的,那就意味着一些边会出现两次。要得到不重复边的条数,我们需要计算仅位于矩阵对角线下方(或者上方)的三角形中的元素,包含对角线。下面的例子展示了如何使用标准库中的函数来实现它:

 1: m |> Matrix.mapi (fun i j value ->
 2:     if i > j then 0.0 else value)
 3:   |> Matrix.sum
 4: val it : float = 4.0

函数Matrix.mpi根据元素在矩阵中的序号以及其原始值来计算得出新值。如同其他与矩阵相关的标准函数一样,此函数将一个新创建的矩阵作为值返回。在上面的例子中,我们将位于对角线以下的元素全部替换为0。在接下来的处理步骤中,我们将新创建的矩阵中的元素全部求和,最后得到边的条数。

 接下章

原文链接:http://tomasp.net/blog/powerpack-matrix.aspx

无人驾驶之车辆控制(1)纯跟踪(Pure Pursuit)算法与Stanley算法 目录引言1 Pure Pursuit纯几何跟踪算法1.1 车辆运动学自行车模型1.2 算法原理1.3 仿真测试2 Stanley算法2.1 算法原理2.2 仿真测试3 总结 引言 本文对Pure Pursuit以及Stanley control两种算法进行了调研以及初步的性能摸底。 1 Pure Pursuit纯几何跟踪算法 1.1 车辆运动学自行车模型 运动学是从几何学的角度研究物体的运动规律,... 阅读详情

相关推荐

eNSP无法启动AR报错码40,而且按照eNSP帮助手册排查都没用,我的处理方法【自己存档版】

eNSP无法启动AR报错码40,而且按照eNSP帮助手册排查都没用,我的处理方法【自己存档版】

mizhiakk的博客 8419

通信网第二章(二)——端间的最短径(D算法、BF算法、F算法)

Dijkstra算法——点对多点 Bellman-Ford算法——点对多点 Floyd-Warshall算法——多点对多点 D算法 D算法把端集分为两组,一组称为置定端集Gp,另一组称为未置定端集G-Gp。 每端都逐步给予一个标值。 对于置定端,标值是vs到该端的最短径的长度; 对于未置定端,所标的值是暂时的,随着算法的进展而调整。 D算法的适用范围 D算法对有向图也...

qq_963157144的博客 3328

新手必看:手把手教你如何通过Github提交CVE漏洞(附完整截图流程)

本文为安全研究新手提供了一份详尽的CVE漏洞提交实战指南。文章重点介绍了如何通过Github平台,从漏洞发现、验证、撰写专业报告到最终提交CVE申请的全流程,并附有完整的截图和沟通模板,帮助初学者迈出负责任漏洞披露的第一步。

ttt77的博客 1253

F#与数学(II) – 在图形算法中使用矩阵(PartI)

在本系列的上篇文章中,我们了解了complex和BigRational类型,它们都是位于F# PowerPack中的数字类型。除了这两种,PowerPack库也包含了一种名为matrix的类型,此类型表示一种由浮点数组成的二维矩阵。   在这篇文章中,你将学会在F#中如何使用矩阵,如何使用F#PowerPack中提供的相关函数。我将用一个例子来介绍此语言库,此例子使用所谓的邻接矩阵来展示图

fsharp_net的专栏 2218

【Codecs系列】x265编码器(十二):子像素运动搜索

在基于块运动补偿的视频编码框架中,运动搜索是最为重要的环节之一,同时也是编码端最为耗时的模块。运动搜索包括整像素运动搜索和子像素运动搜索,其中整像素运动搜索已经有很多快速算法,比如经典的三步搜索法、菱形搜索、六边形搜索以及TZSearch等等;但子像素搜索的快速算法却比较少,本文主要讲解x265编码器中的子像素搜索方法以及相关的快速搜索方法。

优快云明星博主,认证博客专家,视频、Matlab领域优质创作者。 749

【雕爷学编程】Arduino智能家居之DS18B20温度传感器

1、温度和湿度控制:通过连接温度传感器和湿度传感器,Arduino可以实时监测室内环境的温度和湿度,并通过控制空调、加热器或加湿器等执行器,实现室内温湿度的自动调节。设计用户友好的界面和操作方式,提供简单直观的控制和反馈机制,以及考虑用户习惯和需求,能够提升系统的整体用户体验。这意味着用户可以根据自己的需求和创意,自定义和定制智能家居系统的功能和外观。5、能源管理:Arduino可以与电能监测模块和智能插座等设备结合使用,实时监测家庭能源的使用情况,并通过自动控制电器设备的开关,实现能源的有效管理和节约。

雕爷学编程 2874

F#与数学(II) – 在图形算法中使用矩阵(PartIII)

其他矩阵操作 我们将简单的介绍一些F# PowerPack中提供的关于矩阵的有用的函数与操作符用来总结这部分内容。下面的列表给出了一组相似函数的使用示例。 逐点操作 Matrix.cptMax Matrix.cptMin Operators: + and .* matrix -> matrix -> matrix 这些函数与操作对作为参数传入的两个矩阵的对应元素执

fsharp_net的专栏 2409

华为OD统一考试 - 模拟消息队列(Java & Python& JS & C++ & C )

让我们来模拟一个消息队列的运作,有一个发布者和若干消费者,发布者会在给定的时刻向消息队列发送消息,

算法大师! 3519

用F#进行数值计算

F#天生就是数值计算的绝佳选择。理由?函数式设计,PowerPack、MathProvider和Math.NET等库,还有和.NET Framework的互操作性。 F# PowerPack是微软为F#提供的一组库和工具。它带来了额外的类型、词法分析器和语法分析器生成工具、文档生成器以及异步和并行功能的增强等等。Tomas Petricek写了一系列文章,讲述PowerPack提供的数值类型: ...

weixin_34167819的博客 295

Qt | QPalette 类(调色版)

Qt | QPalette 类(调色版)

Qt历险记,专注Qt技术,三年医疗设备研发经验,1年机器视觉研发经验,半年柔性传感研发经验。 775

如何在非序列模式下使用类似图像模功能

如何在非序列模式下使用类似图像模功能

weixin_72050316的博客 552

F#基础算法——插入排序

View Code 1 let insertSort (num: int array)= 2 for i=1 to num.Length-1 do 3 let mutable temp=num.[i] 4 for j=i-1 to 0 do 5 if num.[j]>tem...

weixin_34221775的博客 148

2025.05.29【Network】多组学分析:网络互作图绘制

本文介绍了使用R语言进行网络图绘制的方法与技巧。重点讲解了三个核心R包的使用:igraph用于网络图数据准备与基础绘制,ggraph基于图形语法实现高级可视化,networkD3则为网络图添加交互功能。文章涵盖了从基本概念、包安装、创建网络图对象,到自定义样式布局、添加交互性等完整流程,并提供了度分布、聚类系数等网络分析指标的计算方法。通过清晰的代码示例,帮助读者掌握生物信息学数据可视化的关键技能,为复杂数据的直观展示和分析提供实用工具。

227

F# 之旅(下)

一、写在前面的话 学习 F# 一定要去体会函数式编程的特点,推荐一下阮一峰的日志《函数式编程入门教程》。 二、在这篇文章中 递归函数 记录和可区分联合类型 模式匹配 可选类型 度量单位 类和接口 选用哪种类型 三、原文链接 Tour of F# 备注,原文较长,本人分为《F# 之旅》上下两部分翻译。友情链接《F#之旅(上)...

206

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

python写算法太慢_FSharp运行我的算法比Python慢

我通过电子邮件联系了乔恩·哈罗普医生,他解释了发生的事情:The problem is simply that the program has been optimized for Python. This is common when the programmer is more familiar with one language than the other, of course. You ...

weixin_39905695的博客 204

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

函数式编程(F#)个人随感

函数是编程早就有了,不是只有F#。但是F#让我真正的了解和使用了函数式编程。 记得在GE的时候就深刻的感觉到,一家大的公司对技术的发展是举足轻重的。当然这是题外话了。 以前都是当作茶余饭后的随便看看,但是最近自己亲自用了一下,还是发现一些认识上的惯性误区。 随感随写,不断更新。 1、个人认为函数式编程(FOP),其实就是两个内容:数据和过程。 虽然二者都统一在一个let定

博客搬往 http://begtostudy.cnblogs.com 2041

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

MVG(second)学习笔记- 基础矩阵F和本质矩阵E 单应矩阵H计算

非常感谢Jichao_Peng和.https://zhuanlan.zhihu.com/p/55567702 基础矩阵F和本质矩阵E 单应矩阵H求解 不管是是那种矩阵,在求解方法的分类上大致是都可以分为基于代数误差的线性估计和基于几何误差的非线性估计。在基于代数误差的线性估计中,不管是那种矩阵最后的形式一般都是 ...

算法攻城狮 1916

基本矩阵F和本质矩阵E的详细推导

基本矩阵F/E在计算机视觉中是提纯匹配点、恢复相机位姿的一个法宝。但是它是如何得到的?下面笔者做其简单的推导 如图下图,两视几何图。其中C和C’分别代表左、右摄影中心,x和x’代表同名像点,e和e’代表极点。X是地物点,b 代表基线。 根据以前的博客内容可知,世界坐标系到图像坐标系要经过一个变换,即是x=PX,x’=P’X (1)。详情见 https://blog.youkuaiyun.com/q...

大橙子的博客 1万+

F#与数学(III) – 自定义数字类型(PartI)

本章中,我们定义用于模算术运算[1](也称为时钟运算)的F#数字类型。模算术用于当我们想保留一个通过循环计算在指定范围内的值。例如,时钟的最大值为12小时。当我们将11小时和3小时相加的时候,数值会溢出,结果就为2小时。且别说时钟,这种数字系统对密码学,音乐等也是必需的。 本文介绍了几种在F#中定义任何新的数字类型时必不可少的技术。更重要的是,你将学会如何: ::  用重载运算符定义一个数字类

fsharp_net的专栏 1928

Matlab的F算法

Floyd算法思想 已知A=(aij)m×l ,B=(bjk)l×n ,规定C=A*B=(cij)m×n ,其中cij=min⁡{ai1+b1j,ai2+b2j,…,ail+blj} 。 已知A=(aij)m×n ,B=(bij)m×n ,规定D=A+B=(dij)m×n ,其中dij=min⁡{aij,bij} 。 用以上两个公式来描述Floyd算法:已知距离矩阵D=(dij)n×n ,若...

SmartCar的博客 5186

矩阵--算法--深度学习--(图像处理、机器视觉、人工智能、机器学习)资源整合

理解矩阵(一) (真是大学时候不好好学习给自己挖的坑,现在只能一点一点的补回来,这个介绍的矩阵简单易懂,非常牛) 链接如下: http://blog.youkuaiyun.com/myan/article/details/647511 (偶然在矩阵文章中发现算法的世外桃源--《算法》,非常好的一个网站) 链接如下: http://lib.youkuaiyun.com/base/datastructur

周周的专栏 6558

视频隐私脱敏工程化:CSRT/KCF追踪算法在本地推理中的实现与边界

在短视频内容合规审查中,动态遮挡(Dynamic Masking)是高频且高耗时的环节。传统手动关键帧打码不仅效率低下,且在目标快速移动或遮挡时极易出现遮罩漂移。本文从计算机视觉工程角度,解析基于CSRT与KCF算法的目标追踪方案在视频隐私处理中的技术路径、性能权衡及落地实践。

Mysssone的博客 225

【算法拾光】链表 哈希表|K个一组翻转链表 + 两数之和

K个一组翻转链表需分段反转,借助哑节点与前驱指针维护连接,避免断链;两数之和利用哈希表实现O(1)查找,空间换时间,高效定位目标组合。前者考察链表指针操作,后者聚焦映射关系构建,均为面试高频题。

wuqingyigexiaoba的博客 315

排序算法深度笔记(下):非比较类排序的线性突破与工程边界

排序算法时间复杂度额外空间复杂度稳定性是否基于比较选择排序O(N^2)(O(1))不稳定是冒泡排序O(N^2)(O(1))稳定是插入排序O(N^2)(O(1))稳定是归并排序O(N\log N)(O(N))稳定是快速排序O(N\log N)O(log N)不稳定是堆排序O(N\log N)O(1)不稳定是计数排序(O(N + M))O(M))稳定否基数排序O(N)稳定否桶排序平均O(N) / 最坏O(N^2)

2401_87069538的博客 591
上一篇: F#与数学(II) – 在图形算法中使用矩阵(PartI)
下一篇: F#与数学(II) – 在图形算法中使用矩阵(PartIII)
fsharp_net
博客等级 码龄15年 20粉丝 17原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值