【學習筆記】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)=α,βinf?t[0,1]max?d(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.pswp.cn/diannao/40300.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/40300.shtml
英文地址,請注明出處:http://en.pswp.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;模糊匹配…