【学习笔记】Fréchet距离的 C 语言实现

Fréchet 距离

Fréchet 距离,又称为弗雷歇距离,是一种衡量两条曲线(或两个路径)之间相似性的度量方法。这个概念最初在度量空间理论中被定义,后来被广泛应用于计算机科学、地理信息系统、图像处理、生物信息学等多个领域,特别是在比较和匹配形状、路径或序列时非常有用。

数学背景

首先,我们需要一个基础的数学框架。假设有两个参数化的曲线 A ( t ) A(t) A(t) B ( t ) B(t) B(t),它们定义在一个闭区间 [ 0 , 1 ] [0, 1] [0,1] 上,并且映射到一个度量空间 ( X , d ) (X, d) (X,d) 中,其中 d d d 是这个空间内的两点间距离函数。度量空间可以简单理解为一个集合 X X X 加上一个定义在这个集合上任意两点间距离的方式 d d d

Fréchet距离的定义

Fréchet 距离试图量化这样的场景:假设有两个人分别沿着曲线 A A A B B B 行走,他们可以从各自的起点出发,以任意的速度前进,但要求两人始终保持同步,即每个人在自己路径上的位置与另一人在其路径上的位置之间有一个对应关系。Fréchet 距离是保持彼此距离尽可能小的情况下所需的最大距离。

Fréchet距离的数学定义可以用以下公式表达:

A : [ 0 , 1 ] → X A: [0, 1] \rightarrow X A:[0,1]X B : [ 0 , 1 ] → X B: [0, 1] \rightarrow X B:[0,1]X 是定义在度量空间 ( X , d ) (X, d) (X,d) 中的两条连续曲线,其中 d d d X X X 中两点间的距离函数。Fréchet距离 F ( A , B ) F(A, B) F(A,B) 定义为:

F ( A , B ) = inf ⁡ α , β max ⁡ t ∈ [ 0 , 1 ] d ( A ( α ( t ) ) , B ( β ( t ) ) ) F(A, B) = \inf_{\alpha, \beta} \max_{t \in [0, 1]} d(A(\alpha(t)), B(\beta(t))) F(A,B)=α,βinft[0,1]maxd(A(α(t)),B(β(t)))

这里, α \alpha α β \beta β 是从区间 [ 0 , 1 ] [0, 1] [0,1] 到自身的连续单调递增函数,代表了沿曲线 A A A B B B 的“行走”速度。 α ( t ) \alpha(t) α(t) β ( t ) \beta(t) β(t) 分别表示在时间 t t t 时,沿曲线 A A A B B B 的位置。 inf ⁡ \inf inf 表示 infimum(下确界),即所有可能的 α \alpha α β \beta β 对中最大的 d ( A ( α ( t ) ) , B ( β ( t ) ) ) d(A(\alpha(t)), B(\beta(t))) d(A(α(t)),B(β(t))) 的最小值。

简单来说,这个公式表达了找到两个函数(代表两条路径)上的点对,这些点对在它们各自的路径上以某种方式“同步行走”,使得在任何给定时间点 t t t 上,这两点之间的最大距离尽可能小,最终得到的就是Fréchet距离。

在离散情况下,如果我们将曲线 A A A B B B 近似为点集 { A 1 , A 2 , . . . , A n } \{A_1, A_2, ..., A_n\} {A1,A2,...,An} { B 1 , B 2 , . . . , B m } \{B_1, B_2, ..., B_m\} {B1,B2,...,Bm},则可以通过动态规划等方法来近似计算Fréchet距离,此时的公式和计算方法会有所不同,但基本思想仍然遵循上述原理。

C语言实现

以下是计算 Fréchet 距离的C语言实现示例:

#include <stdio.h>
#include <stdlib.h>
#include <math.h>// 定义点结构体
typedef struct {double x;double y;
} Point;// 计算两点之间的欧几里得距离
double euclidean_distance(Point p1, Point p2) {return sqrt(pow(p1.x - p2.x, 2) + pow(p1.y - p2.y, 2));
}// 递归计算Fréchet距离
double recursive_frechet_distance(Point* P, int i, Point* Q, int j, double** cache) {if (cache[i][j] != -1) {return cache[i][j];}double dist = euclidean_distance(P[i], Q[j]);if (i == 0 && j == 0) {cache[i][j] = dist;} else if (i == 0) {cache[i][j] = fmax(recursive_frechet_distance(P, i, Q, j - 1, cache), dist);} else if (j == 0) {cache[i][j] = fmax(recursive_frechet_distance(P, i - 1, Q, j, cache), dist);} else {double minPrevDist = fmin(fmin(recursive_frechet_distance(P, i - 1, Q, j, cache),recursive_frechet_distance(P, i - 1, Q, j - 1, cache)),recursive_frechet_distance(P, i, Q, j - 1, cache));cache[i][j] = fmax(minPrevDist, dist);}return cache[i][j];
}// 计算Fréchet距离
double frechet_distance(Point* P, int n, Point* Q, int m) {// 创建缓存数组并初始化double** cache = (double**)malloc(n * sizeof(double*));for (int i = 0; i < n; i++) {cache[i] = (double*)malloc(m * sizeof(double));for (int j = 0; j < m; j++) {cache[i][j] = -1;}}double result = recursive_frechet_distance(P, n - 1, Q, m - 1, cache);// 释放缓存数组for (int i = 0; i < n; i++) {free(cache[i]);}free(cache);return result;
}int main() {// 定义两条曲线Point P[] = {{0, 0}, {1, 1}, {2, 2}};Point Q[] = {{0, 0}, {1, 2}, {3, 3}};// 计算Fréchet距离double distance = frechet_distance(P, 3, Q, 3);printf("Fréchet Distance: %f\n", distance);return 0;
}

实际意义

在实际应用中,这个概念可以用来解决多种问题,例如:

  • 地形匹配:在地图学中,用于比较两条路径或地形轮廓的相似性,帮助确定它们是否可能是同一区域的不同表示。
  • 图像分析:在图像处理和计算机视觉中,用来比较形状边界,如手写字符识别。
  • 序列比对:在生物信息学中,用于比较DNA序列或蛋白质结构的相似性,尽管这里的序列通常需要转换成某种曲线形式。
  • 路径规划:在机器人导航中,评估不同路径之间的相似度,帮助选择最佳路径。

优点与缺点

优点

  • 考虑了曲线的整体形状和几何结构,能够更准确地度量两条曲线之间的相似性。
  • 对曲线的参数化方式敏感,能够反映出曲线在不同参数化下的形状变化。

缺点

  • 计算复杂度较高,特别是对于长曲线或高维曲线。
  • 对噪声较敏感,需要对曲线进行预处理以消除噪声影响。

总之,Fréchet距离是一种强大而灵活的工具,用于度量曲线或路径之间的相似性。它在轨迹分析、形状识别等领域有着广泛的应用,但在实际使用中需要考虑其计算复杂度和对噪声的敏感性。


本文链接:https://blog.csdn.net/u012028275/article/details/140139463

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/40300.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用Python实现深度学习模型:迁移学习与领域自适应教程

引言 迁移学习和领域自适应是深度学习中的两个重要概念。迁移学习旨在将已在某个任务上训练好的模型应用于新的任务&#xff0c;而领域自适应则是调整模型以适应不同的数据分布。本文将通过一个详细的教程&#xff0c;介绍如何使用Python实现迁移学习和领域自适应。 环境准备…

Visual Studio常见问题

VS的文件路径为什么要用双斜杠(\)? 答:在编程时,写入文件的路径如image = cvLoadImage("C:\Users\lyb\Documents),这种写法在编译时不会报错,但在运行时会报错,报错图像读入为空,这是因为Windows的路径虽然用的是单斜杠,但在编程时的意义是不同的,单斜杠“\”…

Go语言中的可变参数:灵活而强大的函数参数

Go语言中的可变参数:灵活而强大的函数参数 在Go语言中,可变参数是一种非常有用的特性,它允许函数接受任意数量的参数。这种灵活性使得函数可以更加通用和可复用。本文将深入探讨Go语言中可变参数的用法、原理和最佳实践。 什么是可变参数? 可变参数允许你传递零个或多个值给…

LNMP架构搭建Discuz论坛

LNMP架构是一种用于搭建Web服务器环境的常用架构&#xff0c;由Linux、Nginx、MySQL和PHP组成 组成功能Linux作为操作系统的基础&#xff0c;提供稳定的环境Nginx作为反向代理服务器&#xff0c;处理客户端的请求并将他们转发给后端的应用服务器MySQL作为关系型数据库管理系统…

7.2 数据结构

作业 #include <stdio.h> #include <string.h> #include <stdlib.h> struct student {char name[32];int age;double score; }s[3];void stu_input(struct student *s,int n) {printf("请输入%d个学生的信息&#xff08;姓名&#xff0c;年龄&#xff0…

【服装识别系统】图像识别+Python+人工智能+深度学习+算法模型+TensorFlow

一、介绍 服装识别系统&#xff0c;本系统作为图像识别方面的一个典型应用&#xff0c;使用Python作为主要编程语言&#xff0c;并通过TensorFlow搭建ResNet50卷积神经算法网络模型&#xff0c;通过对18种不同的服装&#xff08;‘黑色连衣裙’, ‘黑色衬衫’, ‘黑色鞋子’, …

Python机器学习实战:利用决策树算法预测鸢尾花种类

引言 在人工智能领域&#xff0c;机器学习作为一种强大的工具正在改变我们对数据的认知和处理方式。Python因其丰富的机器学习库和直观易用的特性&#xff0c;成为了众多开发者首选的语言。本篇文章将带领大家深入了解如何运用Python中的scikit-learn库来构建决策树模型&#…

关系型数据库和矢量数据库分别适用于哪些领域?

关系型数据库和矢量数据库分别适用于哪些领域&#xff1f; 李升伟 关系型数据库适用于以下领域&#xff1a; 1. 金融行业&#xff1a;如银行的交易处理、账户管理等&#xff0c;对数据的一致性和事务处理要求极高。 2. 企业资源规划&#xff08;ERP&#xff09;&#xff1a…

Meta 发布 Meta 3D Gen 文本生成3D模型

Meta推出了 Meta 3D Gen &#xff08;3DGen&#xff09;&#xff0c;这是一种用于文本到 3D 资产生成的最先进的快速管道。3DGen 可在一分钟内提供具有高提示保真度和高质量 3D 形状和纹理的 3D 资产创建。 它支持基于物理的渲染 &#xff08;PBR&#xff09;&#xff0c;这是…

网口串口(Serialport)服务器

文章所用工具http://t.csdnimg.cn/2gIR8http://t.csdnimg.cn/2gIR8 搭建服务器界面 操作配置文件保存方式类 public string FileName { get; set; }public IniHelper(string name) {this.FileName name; //在构造函数中给路径赋值} 1 先导入c语言进行读取操作ini文件的方法 …

Python基于you-get下载网页上的视频

​ 1.python 下载地址 下载 : https://www.python.org/downloads/ 2. 配置环境变量 配置 python_home 地址 配置 python_scripts 地址 在path 中加入对应配置 3. 验证 ​ C:\Users>python --version Python 3.12.4C:\Users>wheel version wheel 0.43.04. 下载 c…

Android SurfaceFlinger——本地窗口连接EGL API(二十四)

通过前面的文章我们属性了 Surface 和 EGLSurface 的相关内容,这里我们继续分析让两者相关联的函数 native_window_api_connect()。 一、连接EGL API 1、window.h native_window_api_connect 源码位置:/frameworks/native/libs/nativewindow/include/system/window.h st…

2024华为OD机试真题-分月饼-(C++/Python)-C卷D卷-200分

2024华为OD机试题库-(C卷+D卷)-(JAVA、Python、C++) 题目描述 中秋节,公司分月饼,m 个员工,买了 n 个月饼,m ≤ n,每个员工至少分 1 个月饼,但可以分多个,单人分到最多月饼的个数是 Max1 ,单人分到第二多月饼个数是 Max2 ,Max1 - Max2 ≤ 3 ,单人分到第 n - 1…

Python从入门到放弃——浮点型变量

浮点型变量 前言 上一篇文章我们研究了整数类型变量&#xff0c;本次我们来开始研究一下浮点类型变量。 浮点类型 浮点数在计算机编程中扮演着重要的角色。它们是一种特殊的数据类型&#xff0c;用于存储和处理小数或实数。在Python中&#xff0c;浮点数是由小数点分隔的…

如何在PhpStorm中运行SQL文件?

如何在PhpStorm中运行SQL文件&#xff1f; 提问&#xff1a;如何在PhpStorm中运行SQL文件&#xff1f; 解答&#xff1a;本文将详细介绍如何在PhpStorm中运行SQL文件的步骤&#xff0c;包括如何配置数据库连接和执行SQL脚本&#xff0c;并附带示例SQL代码。 1. 配置数据库连…

迎接创新浪潮!RFID国军标助力数字化装备场转型

随着大数据、物联网的飞速发展&#xff0c;数字化转型已成为军事发展的核心战略之一。在这一重大历史进程中&#xff0c;广州一芯未来的RFID国军标呈现出独特而重要的作用。它不仅提升了装备管理的效率和准确性&#xff0c;还增强了装备的安全保障和资源配置的合理性。它以高效…

标题:哈尔滨等保测评:技术、管理和人员的协同作战

在大数据时代&#xff0c;信息安全成为各行业不可忽视的关键议题。哈尔滨作为东北地区重要的经济和科技中心&#xff0c;其等保测评工作更是成为了网络安全领域的焦点。等保测评&#xff0c;即信息安全等级保护测评&#xff0c;不仅检验着技术的先进性&#xff0c;也考验着管理…

Linux 下实现 MySQL 数据库每天自动备份定时备份

创建一个备份脚本文件&#xff0c;例如 backup_mysql.sh&#xff0c;并将以下内容添加到该文件中&#xff1a; #!/bin/bash# 设置数据库连接信息 DB_USER"your_database_user" DB_PASSWORD"your_database_password" DB_NAME"your_database_name"…

SpringMVC基础详解

文章目录 一、SpringMVC简介1、什么是MVC2、MVC架构模式与三层模型的区别3、什么是SpringMVC 二、HelloWorld程序1、pom文件2、springmvc.xml3、配置web.xml文件4、html文件5、执行Controller 三、RequestMapping注解1、value属性1.1、基础使用1.2、Ant风格&#xff08;模糊匹配…