拟合平面再思考

0。总结

之前思考了2种拟合平面的方式
1。ransan 随机取样拟合平面
2。特征值分解特征向量,最小特征值就是法向量

其中方法一误差较小,毕竟随机采样的方式可以忽略误差点。而特征值分解的方式如果误差较大,那么得到的结果非常不好

1。扩展

https://www.ilikebigbits.com/2015_03_04_plane_from_points.html
这篇文章说,通过求协方差矩阵就可以更好的拟合平面
这个文章的重点是他假设c=1 也就是c不能等于0。也就是平面的法向量的z轴不能为0
然后求得 a b d 这样就求得了平面方程
ax+by+cz+d=0

但是看代码发现他还要求的最大值?
这是为了避免假设不成立。所以他计算了3次。
假设a=1 ,假设b=1 ,假设c=1。通过这种方式求了3次。获取最大值保证法向量的xyz轴分量假设不为0的情况

然后求得法向量

但是这个法向量和通过协方差矩阵求的还是有差异。具体的取舍就看大家了

2。代码

def getplanefrompoints(points):centroid = np.mean(points, axis=0)r = points - centroidxx = np.sum(r[:, 0] * r[:, 0])xy = np.sum(r[:, 0] * r[:, 1])xz = np.sum(r[:, 0] * r[:, 2])yy = np.sum(r[:, 1] * r[:, 1])yz = np.sum(r[:, 1] * r[:, 2])zz = np.sum(r[:, 2] * r[:, 2])det_x = yy * zz - yz * yzdet_y = xx * zz - xz * xzdet_z = xx * yy - xy * xyif det_x > det_y and det_x > det_z:vecC = (det_x, xz * yz - xy * zz, xy * yz - xz * yy)elif det_y > det_z:vecC = (xz * yz - xy * zz, det_y, xy * xz - yz * xx)else:vecC = (xy * yz - xz * yy, xy * xz - yz * xx, det_z)vecC = vecC / np.linalg.norm(vecC)d = -vecC.dot(centroid)return vecC

3。特征值求解原理

3。1 jacobi

Jacobi 方法是一种迭代法,用于计算对称矩阵的特征值和特征向量。它的基本思想是通过一系列相似变换,逐步将对称矩阵对角化,使得非对角线上的元素逐渐趋于零。以下是 Jacobi 方法的基本原理:

  1. 选择旋转角度: 在每一次迭代中,Jacobi 方法会选择一个最大的非对角线元素,然后计算旋转角度。旋转角度的选择有多种方法,一种常见的是选取使得旋转后的非对角线元素为零的角度。

  2. 构造旋转矩阵: 利用选择的旋转角度,构造一个旋转矩阵。这个旋转矩阵是一个正交矩阵,它的转置等于它的逆。

  3. 相似变换: 将原矩阵通过相似变换,即左乘和右乘旋转矩阵,得到一个新的矩阵。这个新矩阵在对角线上的元素更接近特征值。

  4. 迭代: 重复以上步骤,直到矩阵的非对角线元素足够小,或者达到预定的迭代次数。

Jacobi 方法的优点是简单易懂,容易实现,并且适用于小型矩阵。然而,它的缺点是收敛速度相对较慢,尤其是对于大型矩阵。在实际应用中,更高效的算法(如QR分解、Lanczos 方法等)通常会被使用,以便更快地计算特征值和特征向量。

3。2对角化

对角化是线性代数中的一个重要概念,它涉及将一个矩阵转换为对角矩阵的过程。对角化使得矩阵的很多运算变得更加简单,特别是计算矩阵的幂次、矩阵指数和矩阵函数等操作。

对于一个 (n \times n) 的方阵 (A),如果存在一个可逆矩阵 (P) 使得 (P^{-1}AP) 是一个对角矩阵,即:

[ P^{-1}AP = D ]

其中,(D) 是一个对角矩阵,其对角线上的元素是 (A) 的特征值。这样的矩阵 (P) 被称为 (A) 的特征向量矩阵,而 (D) 则是 (A) 的特征值矩阵。

对角化的步骤如下:

  1. 计算特征值: 找到矩阵 (A) 的特征值 (\lambda).

  2. 计算特征向量: 对于每个特征值,找到对应的特征向量 (\mathbf{v}).

  3. 构造矩阵 (P): 将特征向量按列排列成矩阵 (P).

  4. 对角化: 计算 (P^{-1}AP).

对角化的好处在于,对角矩阵的幂次运算非常简单,因为对角矩阵的幂次就是每个对角元素的幂次。这对于某些数值计算和线性代数的问题是非常有用的。

在实际应用中,对角化不一定对所有矩阵都可行。可对角化的矩阵被称为可对角化矩阵,而对于某些矩阵,它们可能不可对角化。

3。3对角矩阵

对角矩阵是一种特殊形式的矩阵,其中除了主对角线上的元素之外,所有其他元素都为零。一个 (n \times n) 的对角矩阵可以表示为:

[
D = \begin{bmatrix}
d_{1} & 0 & \cdots & 0 \
0 & d_{2} & \cdots & 0 \
\vdots & \vdots & \ddots & \vdots \
0 & 0 & \cdots & d_{n}
\end{bmatrix}
]

其中 (d_{1}, d_{2}, \ldots, d_{n}) 是对角线上的元素。

对角矩阵具有一些有趣的性质,使得它们在线性代数中非常有用。以下是一些关于对角矩阵的重要性质:

  1. 幂次运算简化: 对角矩阵的幂次运算非常简单。如果 (D) 是对角矩阵,那么 (D^k) 的每个对角元素就是 (d_{i}^k)。

  2. 特征值和特征向量: 对角矩阵的特征值就是它的对角元素,而每个对角元素本身就是对应的特征向量。

  3. 可逆性: 对角矩阵是可逆的当且仅当每个对角元素都不为零。

  4. 乘法和加法: 对角矩阵的乘法和加法操作都很简单,因为大部分元素都是零。

对角矩阵在许多数学和工程应用中经常出现,特别是在对角化矩阵的概念中。对角化是将一个矩阵转换为对角矩阵的过程,便于处理矩阵的一些运算。

3。4 python实现

import numpy as npdef jacobi_eigenvalue(A, tol=1e-10, max_iter=1000):"""Jacobi 方法求解对称矩阵的特征值和特征向量Parameters:- A: 对称矩阵- tol: 迭代收敛的容忍度- max_iter: 最大迭代次数Returns:- eigenvalues: 特征值数组- eigenvectors: 特征向量矩阵,每一列是对应的特征向量"""n = A.shape[0]eigenvalues = np.diag(A).copy()  # 初始时取矩阵的对角线元素作为特征值的初始估计eigenvectors = np.eye(n)  # 初始化特征向量矩阵为单位矩阵iter_count = 0while iter_count < max_iter:# 找到最大的非对角元素max_off_diag = np.max(np.abs(np.triu(A, k=1)))if max_off_diag < tol:break  # 收敛条件# 找到最大非对角元素的位置indices = np.where(np.abs(A) == max_off_diag)i, j = indices[0][0], indices[1][0]# 计算旋转角度if A[i, i] == A[j, j]:theta = np.pi / 4else:theta = 0.5 * np.arctan(2 * max_off_diag / (A[i, i] - A[j, j]))# 构造旋转矩阵rotation_matrix = np.eye(n)rotation_matrix[i, i] = np.cos(theta)rotation_matrix[j, j] = np.cos(theta)rotation_matrix[i, j] = -np.sin(theta)rotation_matrix[j, i] = np.sin(theta)# 进行相似变换A = rotation_matrix.T @ A @ rotation_matrixeigenvectors = eigenvectors @ rotation_matrixiter_count += 1return eigenvalues, eigenvectors# 生成一个对称矩阵作为例子
A = np.array([[4.0, -2.0, 2.0],[-2.0, 2.0, -4.0],[2.0, -4.0, 11.0]])eigenvalues, eigenvectors = jacobi_eigenvalue(A)
print("Eigenvalues:")
print(eigenvalues)print("\nEigenvectors:")
print(eigenvectors)

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

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

相关文章

SpringBoot的创建和使用

优点 快速添加依赖&#xff1b; 内置web容器&#xff1b; 自动装配&#xff1b; idea创建 创建maven项目&#xff08;配置&#xff09; 一定要选择2.x版本的Spring Boot 介绍目录 (有这个注解的SpringBootApplication就是启动类) 删除文件 尝试去运行带有SpringBootApplica…

面向对象设计-UML六种箭头含义

目录 UML概述UML语义UML表示法 六种常用关系标识方法泛化实现依赖关联聚合组合 本文参考文章 https://blog.csdn.net/qq_25091281/article/details/123801862 UML概述 UML (Unified Modeling Language)为面向对象软件设计提供统一的、标准的、可视化的建模语言。适用于描述以…

数学分析:含参变量的积分

同样很多收敛性的证明不是重点&#xff0c;但里面的知识还是需要适当掌握&#xff0c;知道中间的大致思考和解决路径即可。 本质还是极限的可交换性&#xff0c;求导可以换到积分里面去操作。 这里要注意变量的区别&#xff0c;首先积分的被积变量是x&#xff0c;但是函数的变量…

springsecurity

springsecurity 一个安全框架&#xff0c;例如&#xff1a;在进行登录之前&#xff0c;会进行一个拦截&#xff0c;经过安全框架之后&#xff0c;才会跳转到原本要登录的地址 culr:&#xff08;不细写&#xff0c;需另找文档&#xff09; 可以进行登录的操作&#xff08;在git…

git 详解-提升篇

git 冷门使用 承接上一篇 《git 进阶篇》&#xff0c;简单讲解 git 冷门使用方法。 码农常规使用工具 git 偶尔也有非常规操作。例如&#xff1a;提交代码时同事已经更新&#xff0c;但又不想回退本地补丁&#xff1b;或者已经提交补丁需要变更提交日志信息。 作者&#xff1…

[Android]问题解决-Device must be bootloader unlocked

现象 在push文件时&#xff0c;remount命令发生如下报错&#xff1a; $ adb remount Device must be bootloader unlocked解决 1. 打开 开发者模式中的OEM unlocking开关 2. fastboot unlock设置 adb reboot bootloader fastboot flashing unlock根据屏幕提示&#xff0c;…

Android 多线程并发详解

一&#xff0c;基础概念 1.1什么是CPU 中央处理器&#xff08;CPU&#xff09;&#xff0c;是电子计算机的主要设备之一&#xff0c;电脑中的核心配件。其功能主要是解释计算机指令以及处理计算机软件中的数据。CPU是计算机中负责读取指令&#xff0c;对指令译码并执行指令的…

MySQL-锁

MySQL的锁机制 1.共享锁(Shared Lock)和排他锁(Exclusive Lock) 事务不能同时具有行共享锁和排他锁&#xff0c;如果事务想要获取排他锁&#xff0c;前提是行没有共享锁和排他锁。而共享锁&#xff0c;只要行没有排他锁都能获取到。 手动开启共享锁/排他锁&#xff1a; -- 对…

计算机是如何启动的

一直好奇计算机启动的原理是怎么样的&#xff1f;最近刚好想搞一下操作系统&#xff0c;故此总结一下。 打开电源 对于现代计算机来说&#xff0c;打开电源是开机的第一步&#xff0c;这一点无用质疑&#xff0c;离开了电&#xff0c;现代社会估计就会垮台。 计算机启动 加电…

Spring Cloud学习笔记【分布式请求链路跟踪-Sleuth】

文章目录 Spring Cloud Sleuth概述概述主要功能&#xff1a;Sleuth中的术语和相关概念官网 zipkin配置下载运行zipkin下载zipkin运行 demo配置服务提供者 lf-userpom.xmlapplication.ymlUserController 服务调用者 lf-authpom.xmlapplication.ymlAuthController 测试 Spring Cl…

JuiceFS 目录配额功能设计详解

JuiceFS 在最近 v1.1 版本中加入了社区中呼声已久的目录配额功能。已发布的命令支持为目录设置配额、获取目录配额信息、列出所有目录配额等。完整的详细信息&#xff0c;请查阅文档。 在设计此功能时&#xff0c;对于它的统计准确性&#xff0c;实效性以及对性能的影响&#…

前端uniapp如何修改下拉框uni-data-select下面的uni-icons插件自带的图片【修改uniapp自带源码图片/图标】

目录 未改前图片未改前源码未改前通过top和bottom 和修改后图片转在线base64大功告成最后 未改前图片 未改前源码 然后注释掉插件带的代码&#xff0c;下面要的 未改前通过top和bottom 和修改后 找到uni-icons源码插件里面样式 图片转在线base64 地址 https://the-x.cn/b…

RK3288:BT656 RN6752调试

这篇文章主要想介绍一下再RK3288平台上面调试BT656 video in的注意事项。以RN6752转接芯片&#xff0c;android10平台为例进行介绍。 目录 1. RK3288 VIDEO INPUT 并口 2. 驱动调试 2.1 RN6752 驱动实现 ①rn6752_g_mbus_config总线相关配置 ②rn6752_querystd配置制式 …

【单片机】18-红外线遥控

一、红外遥控背景知识 1.人机界面 &#xff08;1&#xff09;当面操作&#xff1a;按键&#xff0c;旋转/触摸按键&#xff0c;触摸屏 &#xff08;2&#xff09;遥控操作&#xff1a;红外遥控&#xff0c;433M/2.4G无线通信【穿墙能力强】&#xff0c;蓝牙-WIFI-Zigbee-LoRa等…

基于WTMM算法的图像多重分形谱计算matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 4.1、WTMM算法概述 4.2、WTMM算法原理 4.2.1 二维小波变换 4.2.2 模极大值检测 4.2.3 多重分形谱计算 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 matlab2022a 3.部…

核货宝:服装店收银系统如何选择?收银系统选购指南!

对于各行各业而言&#xff0c;收银系统都是必备的工具。特别是对于像服装店这样的零售门店来说&#xff0c;选择一套适合的收银系统尤为重要。在选择收银系统时&#xff0c;有一些关键的技巧需要注意&#xff0c;以达到软硬件合理搭配、节省开支的目的。下面将分享四个选购服装…

【Java】微服务——微服务介绍和Eureka注册中心

目录 1.微服务介绍2.服务拆分和远程调用2.1.提供者与消费者 3.Eureka注册中心3.1.Eureka的结构和作用3.2.Eureka的结构3.3.搭建Eureka服务3.3.1.引入eureka依赖3.3.2.编写配置文件 3.4.服务注册及拉1&#xff09;引入依赖2&#xff09;配置文件3&#xff09;启动多个user-servi…

C语言编程实现只有一个未知数的两个多项式合并的程序

背景&#xff1a; 直接看题目把&#xff01;就是C语言写两个多项式多项式合并 题目要求&#xff1a; 1. 题目&#xff1a; 编程实现只有一个未知数的两个多项式合并的程序。如&#xff1a; 3x^26x7 和 5x^2-2x9合并结果为8x^24x16。 2. 设计要求 &#xff08;1&#xff09…

【kubernetes】带你了解k8s中PV和PVC的由来

文章目录 1 为什么需要卷(Volume)2 卷的挂载2.1 k8s集群中可以直接使用2.2 需要额外的存储组件2.3 公有云 2 PV(Persistent Volume)3 SC(Storage Class) 和 PVC(Persistent Volume Claim)4 总结 1 为什么需要卷(Volume) Pod是由一个或者多个容器组成的&#xff0c;在启动Pod中…

Python1-Pillow库简单使用

Python1-Pillow库简单使用 1.安装pillow2.打开和显示图像3.图像基本操作4.批量图像格式转换 save5.批量创建缩略图 thumbnail6.批量图像加文字、图片水印 blend composite7.批量调整图像大小resize 1.安装pillow # pip安装或者conda安装 conda install pillow2.打开和显示图像…