15 刚体变换模块(rigid.rs)
rigid.rs是一个表示三维刚体变换(Rigid Transformation)的结构体定义,用于在计算机图形学、机器人学以及物理模拟等领域中表示物体在三维空间中的旋转和平移。在这个定义中,所有长度在变换后都保持不变,这是刚体变换的一个基本特性。
一、rigid.rs源码
//! All matrix multiplication in this module is in row-vector notation,
//! i.e. a vector `v` is transformed with `v * T`, and if you want to apply `T1`
//! before `T2` you use `T1 * T2`use crate::approxeq::ApproxEq;
use crate::trig::Trig;
use crate::{Rotation3D, Transform3D, UnknownUnit, Vector3D};use core::{fmt, hash};#[cfg(feature = "bytemuck")]
use bytemuck::{Pod, Zeroable};
use num_traits::real::Real;
#[cfg(feature = "serde")]
use serde::{Deserialize, Serialize};/// A rigid transformation. All lengths are preserved under such a transformation.
///
///
/// Internally, this is a rotation and a translation, with the rotation
/// applied first (i.e. `Rotation * Translation`, in row-vector notation)
///
/// This can be more efficient to use over full matrices, especially if you
/// have to deal with the decomposed quantities often.
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
#[repr(C)]
pub struct RigidTransform3D<T, Src, Dst> {pub rotation: Rotation3D<T, Src, Dst>,pub translation: Vector3D<T, Dst>,
}impl<T, Src, Dst> RigidTransform3D<T, Src, Dst> {/// Construct a new rigid transformation, where the `rotation` applies first#[inline]pub const fn new(rotation: Rotation3D<T, Src, Dst>, translation: Vector3D<T, Dst>) -> Self {Self {rotation,translation,}}
}impl<T: Copy, Src, Dst> RigidTransform3D<T, Src, Dst> {pub fn cast_unit<Src2, Dst2>(&self) -> RigidTransform3D<T, Src2, Dst2> {RigidTransform3D {rotation: self.rotation.cast_unit(),translation: self.translation.cast_unit(),}}
}impl<T: Real + ApproxEq<T>, Src, Dst> RigidTransform3D<T, Src, Dst> {/// Construct an identity transform#[inline]pub fn identity() -> Self {Self {rotation: Rotation3D::identity(),translation: Vector3D::zero(),}}/// Construct a new rigid transformation, where the `translation` applies first#[inline]pub fn new_from_reversed(translation: Vector3D<T, Src>,rotation: Rotation3D<T, Src, Dst>,) -> Self {// T * R// = (R * R^-1) * T * R// = R * (R^-1 * T * R)// = R * T'//// T' = (R^-1 * T * R) is also a translation matrix// It is equivalent to the translation matrix obtained by rotating the// translation by Rlet translation = rotation.transform_vector3d(translation);Self {rotation,translation,}}#[inline]pub fn from_rotation(rotation: Rotation3D<T, Src, Dst>) -> Self {Self {rotation,translation: Vector3D::zero(),}}#[inline]pub fn from_translation(translation: Vector3D<T, Dst>) -> Self {Self {translation,rotation: Rotation3D::identity(),}}/// Decompose this into a translation and an rotation to be applied in the opposite order////// i.e., the translation is applied _first_#[inline]pub fn decompose_reversed(&self) -> (Vector3D<T, Src>, Rotation3D<T, Src, Dst>) {// self = R * T// = R * T * (R^-1 * R)// = (R * T * R^-1) * R)// = T' * R//// T' = (R^ * T * R^-1) is T rotated by R^-1let translation = self.rotation.inverse().transform_vector3d(self.translation);(translation, self.rotation)}/// Returns the multiplication of the two transforms such that/// other's transformation applies after self's transformation.////// i.e., this produces `self * other` in row-vector notation#[inline]pub fn then<Dst2>(&self,other: &RigidTransform3D<T, Dst, Dst2>,) -> RigidTransform3D<T, Src, Dst2> {// self = R1 * T1// other = R2 * T2// result = R1 * T1 * R2 * T2// = R1 * (R2 * R2^-1) * T1 * R2 * T2// = (R1 * R2) * (R2^-1 * T1 * R2) * T2// = R' * T' * T2// = R' * T''//// (R2^-1 * T2 * R2^) = T' = T2 rotated by R2// R1 * R2 = R'// T' * T2 = T'' = vector addition of translations T2 and T'let t_prime = other.rotation.transform_vector3d(self.translation);let r_prime = self.rotation.then(&other.rotation);let t_prime2 = t_prime + other.translation;RigidTransform3D {rotation: r_prime,translation: t_prime2,}}/// Inverts the transformation#[inline]pub fn inverse(&self) -> RigidTransform3D<T, Dst, Src> {// result = (self)^-1// = (R * T)^-1// = T^-1 * R^-1// = (R^-1 * R) * T^-1 * R^-1// = R^-1 * (R * T^-1 * R^-1)// = R' * T'//// T' = (R * T^-1 * R^-1) = (-T) rotated by R^-1// R' = R^-1//// An easier way of writing this is to use new_from_reversed() with R^-1 and T^-1RigidTransform3D::new_from_reversed(-self.translation, self.rotation.inverse())}pub fn to_transform(&self) -> Transform3D<T, Src, Dst>whereT: Trig,{self.rotation.to_transform().then(&self.translation.to_transform())}/// Drop the units, preserving only the numeric value.#[inline]pub fn to_untyped(&self) -> RigidTransform3D<T, UnknownUnit, UnknownUnit> {RigidTransform3D {rotation: self.rotation.to_untyped(),translation: self.translation.to_untyped(),}}/// Tag a unitless value with units.#[inline]pub fn from_untyped(transform: &RigidTransform3D<T, UnknownUnit, UnknownUnit>) -> Self {RigidTransform3D {rotation: Rotation3D::from_untyped(&transform.rotation),translation: Vector3D::from_untyped(transform.translation),}}
}impl<T: fmt::Debug, Src, Dst> fmt::Debug for RigidTransform3D<T, Src, Dst> {fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {f.debug_struct("RigidTransform3D").field("rotation", &self.rotation).field("translation", &self.translation).finish()}
}impl<T: PartialEq, Src, Dst> PartialEq for RigidTransform3D<T, Src, Dst> {fn eq(&self, other: &Self) -> bool {self.rotation == other.rotation && self.translation == other.translation}
}
impl<T: Eq, Src, Dst> Eq for RigidTransform3D<T, Src, Dst> {}impl<T: hash::Hash, Src, Dst> hash::Hash for RigidTransform3D<T, Src, Dst> {fn hash<H: hash::Hasher>(&self, state: &mut H) {self.rotation.hash(state);self.translation.hash(state);}
}impl<T: Copy, Src, Dst> Copy for RigidTransform3D<T, Src, Dst> {}impl<T: Clone, Src, Dst> Clone for RigidTransform3D<T, Src, Dst> {fn clone(&self) -> Self {RigidTransform3D {rotation: self.rotation.clone(),translation: self.translation.clone(),}}
}#[cfg(feature = "arbitrary")]
impl<'a, T, Src, Dst> arbitrary::Arbitrary<'a> for RigidTransform3D<T, Src, Dst>
whereT: arbitrary::Arbitrary<'a>,
{fn arbitrary(u: &mut arbitrary::Unstructured<'a>) -> arbitrary::Result<Self> {Ok(RigidTransform3D {rotation: arbitrary::Arbitrary::arbitrary(u)?,translation: arbitrary::Arbitrary::arbitrary(u)?,})}
}#[cfg(feature = "bytemuck")]
unsafe impl<T: Zeroable, Src, Dst> Zeroable for RigidTransform3D<T, Src, Dst> {}#[cfg(feature = "bytemuck")]
unsafe impl<T: Pod, Src: 'static, Dst: 'static> Pod for RigidTransform3D<T, Src, Dst> {}impl<T: Real + ApproxEq<T>, Src, Dst> From<Rotation3D<T, Src, Dst>>for RigidTransform3D<T, Src, Dst>
{fn from(rot: Rotation3D<T, Src, Dst>) -> Self {Self::from_rotation(rot)}
}impl<T: Real + ApproxEq<T>, Src, Dst> From<Vector3D<T, Dst>> for RigidTransform3D<T, Src, Dst> {fn from(t: Vector3D<T, Dst>) -> Self {Self::from_translation(t)}
}#[cfg(test)]
mod test {use super::RigidTransform3D;use crate::default::{Rotation3D, Transform3D, Vector3D};#[test]fn test_rigid_construction() {let translation = Vector3D::new(12.1, 17.8, -5.5);let rotation = Rotation3D::unit_quaternion(0.5, -7.8, 2.2, 4.3);let rigid = RigidTransform3D::new(rotation, translation);assert!(rigid.to_transform().approx_eq(&rotation.to_transform().then(&translation.to_transform())));let rigid = RigidTransform3D::new_from_reversed(translation, rotation);assert!(rigid.to_transform().approx_eq(&translation.to_transform().then(&rotation.to_transform())));}#[test]fn test_rigid_decomposition() {let translation = Vector3D::new(12.1, 17.8, -5.5);let rotation = Rotation3D::unit_quaternion(0.5, -7.8, 2.2, 4.3);let rigid = RigidTransform3D::new(rotation, translation);let (t2, r2) = rigid.decompose_reversed();assert!(rigid.to_transform().approx_eq(&t2.to_transform().then(&r2.to_transform())));}#[test]fn test_rigid_inverse() {let translation = Vector3D::new(12.1, 17.8, -5.5);let rotation = Rotation3D::unit_quaternion(0.5, -7.8, 2.2, 4.3);let rigid = RigidTransform3D::new(rotation, translation);let inverse = rigid.inverse();assert!(rigid.then(&inverse).to_transform().approx_eq(&Transform3D::identity()));assert!(inverse.to_transform().approx_eq(&rigid.to_transform().inverse().unwrap()));}#[test]fn test_rigid_multiply() {let translation = Vector3D::new(12.1, 17.8, -5.5);let rotation = Rotation3D::unit_quaternion(0.5, -7.8, 2.2, 4.3);let translation2 = Vector3D::new(9.3, -3.9, 1.1);let rotation2 = Rotation3D::unit_quaternion(0.1, 0.2, 0.3, -0.4);let rigid = RigidTransform3D::new(rotation, translation);let rigid2 = RigidTransform3D::new(rotation2, translation2);assert!(rigid.then(&rigid2).to_transform().approx_eq(&rigid.to_transform().then(&rigid2.to_transform())));assert!(rigid2.then(&rigid).to_transform().approx_eq(&rigid2.to_transform().then(&rigid.to_transform())));}
}
二、结构体字段说明:
- rotation: 这是一个Rotation3D类型的字段,表示旋转变换。Rotation3D是另一个结构体,用于表示三维空间中的旋转。Src和Dst是泛型参数,分别代表旋转前后的坐标系。
- translation: 这是一个Vector3D类型的字段,表示平移变换。Vector3D是一个表示三维向量的结构体,Dst表示平移后的坐标系。
- 变换顺序:在这个结构体中,旋转是先于平移应用的,即先进行旋转(Rotation * Translation),然后进行平移。这里的乘法表示的是变换的组合,但在行向量表示法中,通常理解为矩阵乘法,其中旋转矩阵乘以平移向量(实际上是通过扩展平移向量为齐次坐标形式后进行矩阵乘法)。
三、方法
- 构造方法 new:
- 这个方法用于创建一个新的 RigidTransform3D 实例。
- 它接受一个旋转 Rotation3D<T, Src, Dst> 和一个平移 Vector3D<T, Dst> 作为参数。
- 这里的 T 表示数值类型,Src 和 Dst 分别表示旋转和平移的单位类型。
- cast_unit 方法:
- 这个方法用于将 RigidTransform3D 实例的单位从一种类型转换为另一种类型。
- 它要求数值类型 T 实现 Copy trait,以便可以复制数值。
- Src2 和 Dst2 是新的单位类型。
- identity 方法:
- 用于构造一个表示恒等变换的 RigidTransform3D 实例。
- 恒等变换意味着物体不会发生任何旋转或平移。
+这个方法要求数值类型 T 实现 Real 和 ApproxEq traits。
- to_transform 方法:
- 这个方法将 RigidTransform3D 转换为一个更一般的 Transform3D 实例。
- 它要求数值类型 T 实现 Trig trait,以便可以进行三角函数计算。
- 方法内部,首先将旋转转换为变换,然后将平移转换为变换,并将这两个变换组合起来。
- to_untyped 和 from_untyped 方法:
- to_untyped 方法用于去除单位,只保留数值值,返回一个单位类型为 UnknownUnit 的 RigidTransform3D 实例。
- from_untyped 方法则相反,它接受一个单位类型为 UnknownUnit 的 RigidTransform3D 实例,并为其添加单位,返回一个新的 RigidTransform3D 实例。
- fmt::Debug实现:
- 为RigidTransform3D实现了Debug trait,允许使用{:?}格式化字符串来打印该类型的实例。
- 在实现中,通过f.debug_struct(“RigidTransform3D”)创建一个调试结构体,并添加rotation和translation两个字段,最后调用.finish()完成结构体的构建。
- PartialEq和Eq实现:
- 为RigidTransform3D实现了PartialEq trait,允许比较两个实例是否相等。
- 通过比较rotation和translation两个成员是否相等来确定两个RigidTransform3D实例是否相等。
- 实现了Eq trait,这通常是在实现PartialEq之后自动实现的,表示RigidTransform3D实例之间的相等性是一致和反射的。
- hash::Hash实现:
- 为RigidTransform3D实现了Hash trait,允许该类型的实例被哈希。
- 实现中,通过调用self.rotation.hash(state)和self.translation.hash(state)将rotation和translation两个成员的值合并到哈希状态中。
- Copy和Clone实现:
- 如果T实现了Copy trait,则RigidTransform3D也实现了Copy trait,允许通过复制位模式来复制实例。
- 如果T实现了Clone trait,则RigidTransform3D也实现了Clone trait,允许通过调用clone方法来创建实例的深拷贝。
- arbitrary::Arbitrary实现(依赖proptest库):
- 为RigidTransform3D实现了Arbitrary trait,允许在属性测试中自动生成实例。
- 通过调用arbitrary::Arbitrary::arbitrary(u)?分别为rotation和translation生成任意值。
- Zeroable和Pod实现(依赖bytemuck库):
- 如果T实现了Zeroable trait,则RigidTransform3D也实现了Zeroable trait,允许将实例的内存区域清零。
- 如果T实现了Pod trait(Plain Old Data,简单旧数据),且Src和Dst具有静态生命周期,则RigidTransform3D也实现了Pod trait,表示实例的内存布局是平凡的,可以安全地复制和比较内存块。
- 从Rotation3D和Vector3D的类型转换:
- 如果T实现了Real trait(通常表示实数类型,如浮点数)和ApproxEq trait(允许近似相等比较),则可以从Rotation3D<T, Src, Dst>和Vector3D<T, Dst>类型转换为RigidTransform3D<T, Src, Dst>。
- 提供了from_rotation和from_translation的便捷方法(虽然在这段代码中没有直接定义这些方法,但从上下文中可以推断出这一点)。
相关文章:
15 刚体变换模块(rigid.rs)
rigid.rs是一个表示三维刚体变换(Rigid Transformation)的结构体定义,用于在计算机图形学、机器人学以及物理模拟等领域中表示物体在三维空间中的旋转和平移。在这个定义中,所有长度在变换后都保持不变,这是刚体变换的…...
springboot使用rabbitmq
使用springboot创建rabbitMQ的链接。 整个项目结构如下: 1.maven依赖 <dependency><groupId>com.rabbitmq</groupId><artifactId>amqp-client</artifactId><version>3.4.1</version> </dependency>application.y…...
【Linux】一文带你入门了解线程和虚拟地址空间中页表映射的秘密(内附手绘底层逻辑图 通俗易懂)
绪论 每日激励:“努力去做自己该做的,但是不要期待回报,不是付出了就会有回报的,做了就不要后悔,不做才后悔。—Jack” 绪论: 本章是LInux中非常重要的线程部分,通过了解线程的基本概念&am…...
高并发、高可用的消息队列(MQ)设计与实战
目录 背景与历史消息队列的核心功能高并发、高可用的业务场景消息队列的实用性企业规模与消息队列的选择Java实战案例:基于RabbitMQ的高并发、高可用消息队列 6.1 环境准备6.2 RabbitMQ的安装与配置6.3 Java客户端集成6.4 生产者与消费者实现6.5 高并发处理6.6 高可…...
nginx 新手指南
文章来源:https://nginx.cadn.net.cn/beginners_guide.html 本指南对 nginx 进行了基本的介绍,并描述了一些 可以用它完成的简单任务。 假设 nginx 已经安装在阅读器的机器上。 如果不是,请参阅 安装 nginx 页面。 本指南介绍如何启动和停止…...
7-4 西安距离
小明来到了古都西安,想去参观大唐西市! 西安的道路可以看做是与x轴或y轴垂直的直线,小明位于(a,b),而目的地位于(c,d),问最少几步可以到达。 输入格式: 一行中四个整数,a,b,c,d,表示坐标为(a…...
VScode+Latex (Recipe terminated with fatal error: spawn xelatex ENOENT)
使用VSCode编辑出现Recipe terminated with fatal error: spawn xelatex ENOENT问题咋办? 很好解决,大概率的原因是因为latex没有添加到系统环境变量中,所有设置的编译工具没有办法找到才出现的这种情况。 解决方法: winR 然后输…...
使用 Elastic Cloud Hosted 优化长期数据保留:确保政府合规性和效率
作者:来自 Elastic Jennie Davidowitz 在数字时代,州和地方政府越来越多地承担着管理大量数据的任务,同时确保遵守严格的监管要求。这些法规可能因司法管辖区而异,通常要求将数据保留较长时间 —— 有时从一年到七年不等。遵守刑事…...
51单片机 02 独立按键
一、独立按键控制LED亮灭 轻触按键:相当于是一种电子开关,按下时开关接通,松开时开关断开,实现原理是通过轻触按键内部的金属弹片受力弹动来实现接通和断开。 #include <STC89C5xRC.H> void main() { // P20xFE;while(1){…...
海外问卷调查渠道查,具体运营的秘密
相信只要持之以恒并逐渐掌握技巧,每一位调查人在踏上征徐之时都会非常顺利的。并在日后的职业生涯中拥有捉刀厮杀的基本技能!本文会告诉你如何做好一个优秀的海外问卷调查人。 在市场经济高速发展的今天,众多的企业为了自身的生存和发展而在…...
Vue.js 的介绍与组件开发初步
Vue.js 的介绍与组件开发初步 Vue.js 的介绍与组件开发初步引言第一部分:Vue.js 基础入门1.1 什么是 Vue.js?1.2 搭建 Vue.js 开发环境安装 Node.js 和 npm安装 Vue CLI创建新项目运行示例 1.3 第一个 Vue.js 示例 第二部分:Vue.js 组件开发基…...
Shadow DOM举例
这东西具有隔离效果,对于一些插件需要append一些div倒是不错的选择 <!DOCTYPE html> <html lang"zh-CN"> <head> <meta charset"utf-8"> <title>演示例子</title> </head> <body> <style&g…...
kamailio-Core 说明书 版本:Kamailio SIP Server v6.0.x(稳定版)
Core 说明书 版本:Kamailio SIP Server v6.0.x(稳定版) 概述 本教程收集了 Kamailio 导出的函数和参数 core 添加到配置文件中。 注意:此页面上的参数不按字母顺序排列。 结构 kamailio.cfg 的结构可以看作是三个部分ÿ…...
PHP XML操作指南
PHP XML操作指南 引言 随着互联网的快速发展,数据交换和共享变得越来越重要。XML(可扩展标记语言)作为一种灵活的标记语言,被广泛应用于各种数据交换场景。PHP作为一种流行的服务器端脚本语言,具有强大的XML处理能力…...
一文了解DeepSeek
1. DeepSeek 的起源 创立时间:DeepSeek 于 2023 年由中国的梁文锋创立。 V3 模型训练成本:最终训练成本为 600 万美元。 开源:DeepSeek 提供开源版本。 流行度:DeepSeek R1 模型成为 Apple 应用商店中下载量最高的应用。 2. …...
三角形的最大周长(976)
976. 三角形的最大周长 - 力扣(LeetCode) 可以一起总结的题目:三数之和(15)-CSDN博客 官方解法: class Solution { public://官方解法int largestPerimeter(vector<int>& nums) {sort(nums.be…...
10:预处理
预处理 1、宏替换2、头文件包含3、条件编译4、typedef和#define的区别5、#define中的注意点5.1、使用do....while(0)5.2、#和##的含义 C语言编译器在编译程序之前,会先使用预处理器(预处理器)处理代码,代码经过预处理之后再送入编译器进行编译。预处理器…...
一文讲解HashMap线程安全相关问题(上)
HashMap不是线程安全的,主要有以下几个问题: ①、多线程下扩容会死循环。JDK1.7 中的 HashMap 使用的是头插法插入元素,在多线程的环境下,扩容的时候就有可能导致出现环形链表,造成死循环。 JDK 8 时已经修复了这个问…...
C++泛型编程指南04-(对默认调用参数的类型推断)
文章目录 问题描述解决方案示例代码 关键点解释进一步改进:结合概念约束 你提到的情况确实是一个常见的问题:在C中,类型推断不适用于默认调用参数。这意味着如果你希望函数模板能够通过默认参数来实例化,你需要为模板参数提供一个…...
Python爬虫:1药城店铺爬虫(完整代码)
⭐️⭐️⭐️⭐️⭐️欢迎来到我的博客⭐️⭐️⭐️⭐️⭐️ 🐴作者:秋无之地 🐴简介:CSDN爬虫、后端、大数据领域创作者。目前从事python爬虫、后端和大数据等相关工作,主要擅长领域有:爬虫、后端、大数据…...
浅谈知识蒸馏技术
最近爆火的DeepSeek 技术,将知识蒸馏技术运用推到我们面前。今天就简单介绍一下知识蒸馏技术并附上python示例代码。 知识蒸馏(Knowledge Distillation)是一种模型压缩技术,它的核心思想是将一个大型的、复杂的教师模型࿰…...
【人工智能】使用Python和Hugging Face构建情感分析应用:从模型训练到Web部署
《Python OpenCV从菜鸟到高手》带你进入图像处理与计算机视觉的大门! 解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界 情感分析是自然语言处理(NLP)中的重要任务,它通过分析文本来判断情绪或观点的倾向性。近年来,预训练语言模型如BERT、GPT等在情感分析任…...
【R语言】函数
一、函数格式 如下所示: hello:函数名;function:定义的R对象是函数而不是其它变量;():函数的输入参数,可以为空,也可以包含参数;{}:函数体,如果…...
python leetcode 笔记
只为记录一些python相关的特殊写法 无穷大,无穷小,NAN float(inf), float(-inf), float(nan) 判断字符的类型 isdigit(x) isspace(x) 字符串拼接 /.join([a,b,c]) # a/b/c 格式转换,字符转整形 ord(a) # 97 chr(97) # a 进制转…...
基于SpringBoot的青年公寓服务平台的设计与实现(源码+SQL脚本+LW+部署讲解等)
专注于大学生项目实战开发,讲解,毕业答疑辅导,欢迎高校老师/同行前辈交流合作✌。 技术范围:SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容:…...
深入剖析 HTML5 新特性:语义化标签和表单控件完全指南
系列文章目录 01-从零开始学 HTML:构建网页的基本框架与技巧 02-HTML常见文本标签解析:从基础到进阶的全面指南 03-HTML从入门到精通:链接与图像标签全解析 04-HTML 列表标签全解析:无序与有序列表的深度应用 05-HTML表格标签全面…...
kamailio的kamctl的使用
kamctl 是 Kamailio SIP 服务器的管理工具,用于执行各种管理任务,如启动、停止、重启 Kamailio 进程,管理用户、ACL、路由、信任的 IP 地址等。以下是对 kamctl 命令的解释及举例说明: 1. 启动、停止、重启 Kamailio start: 启动…...
[创业之路-270]:《向流程设计要效率》-2-企业流程架构模式 POS架构(规划、业务运营、支撑)、OES架构(业务运营、使能、支撑)
目录 一、POS架构 二、OES架构 三、POS架构与OES架构的差异 四、各自的典型示例 POS架构典型示例 OES架构典型示例 示例分析 五、各自的典型企业 POS架构典型企业 OES架构典型企业 分析 六、各自典型的流程 POS架构的典型流程 OES架构的典型流程 企业流程架构模式…...
【leetcode100】路径总和Ⅲ
1、题目描述 给定一个二叉树的根节点 root ,和一个整数 targetSum ,求该二叉树里节点值之和等于 targetSum 的 路径 的数目。 路径 不需要从根节点开始,也不需要在叶子节点结束,但是路径方向必须是向下的(只能从父节点…...
用结构加法3ax+1预测第4点的分布
有1个点在19*19的平面上在某种力的作用下运动,轨迹为 共移动了90步,按照(0,1,2,3),(1,2,3,4),…,&…...
CTF-web: Python YAML反序列化利用
PyYAML存在以下几个特殊标签,如果这些标签被不安全的解析,会造成解析漏洞 从 PyYaml 版本 6.0 开始,load 的默认加载器已切换到 SafeLoader,以降低远程代码执行的风险。更新后易受攻击的是 yaml.unsafe_load 和 yaml.load(input, Loaderyaml.UnsafeLoade…...
JDK-1.8.0_432安装(CentOS7)
目录 1、卸载系统自带JDK 2、下载安装包并解压 3、赋予可执行权限 4、设置环境变量 5、刷新环境变量 6、查看JDK版本 1、卸载系统自带JDK # 查询出自带的jdk rpm -qa | grep jdk rpm -qa | grep java # 将上述命令列出的包依次删除 rpm -e --nodeps xxxxxxx 2、下载…...
OpenGL学习笔记(五):Textures 纹理
文章目录 纹理坐标纹理环绕方式纹理过滤——处理纹理分辨率低的情况多级渐远纹理Mipmap——处理纹理分辨率高的情况加载与创建纹理 ( <stb_image.h> )生成纹理应用纹理纹理单元练习1练习2练习3练习4 通过上一篇着色部分的学习,我们可以…...
【Pytorch和Keras】使用transformer库进行图像分类
目录 一、环境准备二、基于Pytorch的预训练模型1、准备数据集2、加载预训练模型3、 使用pytorch进行模型构建 三、基于keras的预训练模型四、模型测试五、参考 现在大多数的模型都会上传到huggface平台进行统一的管理,transformer库能关联到huggface中对应的模型&am…...
2025年Android开发趋势全景解读
文章目录 一、界面开发:从"手写代码"到"智能拼装"1.1 Jetpack Compose实战进化1.2 淘汰XML布局的三大信号 二、AI融合开发:无需炼丹的普惠智能2.1 设备端AI三大杀手级应用2.2 成本对比:设备端VS云端AI 三、跨平台演进&am…...
Python NumPy(12):NumPy 字节交换、NumPy 副本和视图、NumPy 矩阵库(Matrix)
1 NumPy 字节交换 在几乎所有的机器上,多字节对象都被存储为连续的字节序列。字节顺序,是跨越多字节的程序对象的存储规则。 大端模式:指数据的高字节保存在内存的低地址中,而数据的低字节保存在内存的高地址中,这样的…...
【Vaadin flow 实战】第5讲-使用常用UI组件绘制页面元素
vaadin flow官方提供的UI组件文档地址是 https://vaadin.com/docs/latest/components这里,我简单实战了官方提供的一些免费的UI组件,使用案例如下: Accordion 手风琴 Accordion 手风琴效果组件 Accordion 手风琴-测试案例代码 Slf4j PageT…...
第三篇:模型压缩与量化技术——DeepSeek如何在边缘侧突破“小而强”的算力困局
——从算法到芯片的全栈式优化实践 随着AI应用向移动终端与物联网设备渗透,模型轻量化成为行业核心挑战。DeepSeek通过自研的“算法-编译-硬件”协同优化体系,在保持模型性能的前提下,实现参数量与能耗的指数级压缩。本文从技术原理、工程实…...
搜索与图论复习2最短路
单源最短路---所有边权是正数(Dijkstra算法O(n^2)--稠密图(邻接矩阵)和堆优化的Dijkstra算法O(mlogn)--稀疏图(邻接表)) 或存在负边权(Bellman-ford贝尔曼福特算法O(nm)和SPFA一般O(m) 最坏O(nm) ) 多源最短路---Floyd算法O(n^3) 一、迪杰斯特拉算法(Dijkstra):1…...
redis集群理论详解
一. Redis集群发展历程 本片文章只介绍集群理论知识,不包含Redis集群搭建教程 教程文章请点击docker搭建redis集群(三主三从) 阶段一:单机版Redis 优点: 简单:易于部署和使用,适合小型项目或初期…...
本地缓存~
前言 Caffeine是使用Java8对Guava缓存的重写版本,在Spring Boot 2.0中取而代之,基于LRU算法实现,支持多种缓存过期策略。 以下摘抄于https://github.com/ben-manes/caffeine/wiki/Benchmarks-zh-CN 基准测试通过使用Java microbenchmark ha…...
SpringBoot 整合 SpringMVC:SpringMVC的注解管理
分类: 中央转发器(DispatcherServlet)控制器视图解析器静态资源访问消息转化器格式化静态资源管理 中央转发器: 中央转发器被 SpringBoot 自动接管,不需要我们在 web.xml 中配置: <servlet><servlet-name>chapter2&l…...
YOLO11/ultralytics:环境搭建
前言 人工智能物体识别行业应该已经饱和了吧?或许现在并不是一个好的入行时候。 最近看到了各种各样相关的扩展应用,为了理解它,我不得不去尝试了解一下。 我选择了git里非常受欢迎的yolo系列,并尝试了最新版本YOLO11或者叫它ultr…...
扩散模型(三)
相关阅读: 扩散模型(一) 扩散模型(二) Latent Variable Space 潜在扩散模型(LDM;龙巴赫、布拉特曼等人,2022 年)在潜在空间而非像素空间中运行扩散过程,这…...
探索数学:从起源到未来的无尽旅程
数学的定义与本质 数学,这门古老而又充满魅力的学科,自人类文明诞生之初便如影随形。然而,要精准地定义数学并非易事,不同的学者从各自的视角出发,给出了多样的阐释。 亚里士多德将数学定义为 “数量科学”ÿ…...
OpenAI发布o3-mini:免费推理模型,DeepSeek引发的反思
引言 在人工智能领域,OpenAI再次引领潮流,推出了全新的推理模型系列——o3-mini。这一系列包括low、medium和high三个版本,旨在进一步推动低成本推理的发展。与此同时,OpenAI的CEO奥特曼也在Reddit的“有问必答”活动中罕见地公开…...
React中使用箭头函数定义事件处理程序
React中使用箭头函数定义事件处理程序 为什么使用箭头函数?1. 传递动态参数2. 避免闭包问题3. 确保每个方块的事件处理程序是独立的4. 代码可读性和维护性 示例代码总结 在React开发中,处理事件是一个常见的任务。特别是当我们需要传递动态参数时&#x…...
自制虚拟机(C/C++)(三、做成标准GUI Windows软件,扩展指令集,直接支持img软盘)
开源地址:VMwork 要使终端不弹出, #pragma comment(linker, "/subsystem:windows /ENTRY:mainCRTStartup") 还要实现jmp near 0x01类似的 本次的main.cpp #include <graphics.h> #include <conio.h> #include <windows.h> #includ…...
C# 语言基础全面解析
.NET学习资料 .NET学习资料 .NET学习资料 一、引言 C# 是一种功能强大、面向对象且类型安全的编程语言,由微软开发,广泛应用于各种类型的软件开发,从桌面应用、Web 应用到游戏开发等领域。本文将全面介绍 C# 语言的基础知识,帮…...
MySQL的覆盖索引
MySQL的覆盖索引 前言 当一个索引包含了查询所需的全部字段时,就可以提高查询效率,这样的索引又被称之为覆盖索引。 以MySQL常见的三种存储引擎为例:InnoDB、MyISAM、Memory,对于覆盖索引提高查询效率的方式均不同,…...