首页 > 其他分享 >0191-向量的四则运算

0191-向量的四则运算

时间:2024-07-17 14:40:32浏览次数:6  
标签:Vector3 Self 四则运算 rhs fn 0191 self 向量

环境

  • Time 2022-11-15
  • WSL-Ubuntu 22.04
  • Rust 1.65.0

前言

说明

参考:https://raytracing.github.io/books/RayTracingInOneWeekend.html

目标

定义三维向量的几个基本运算函数。

加法

两个向量相加,结果为对应方向上的数相加。

// 向量的加法
impl Add for Vector3 {
    type Output = Self;

    fn add(self, rhs: Self) -> Self {
        Vector3 {
            x: self.x + rhs.x,
            y: self.y + rhs.y,
            z: self.z + rhs.z,
        }
    }
}

减法

两个向量相减,结果为对应方向上的数相减。

// 向量的减法
impl Sub for Vector3 {
    type Output = Self;

    fn sub(self, rhs: Self) -> Self {
        Self {
            x: self.x - rhs.x,
            y: self.y - rhs.y,
            z: self.z - rhs.z,
        }
    }
}

数乘

一个数乘以向量,对应每个方向上乘以这个数。

// 向量和数字的乘法
impl Mul<f64> for Vector3 {
    type Output = Self;

    fn mul(self, rhs: f64) -> Self {
        Self {
            x: self.x * rhs,
            y: self.y * rhs,
            z: self.z * rhs,
        }
    }
}

// 数字和向量的乘法
impl Mul<Vector3> for f64 {
    type Output = Vector3;

    fn mul(self, rhs: Vector3) -> Vector3 {
        rhs * self
    }
}

点乘

向量的点乘,每个方向上的数相乘然后相加。

/// 向量的点乘
pub fn dot(self, other: Vector3) -> f64 {
    self.x * other.x + self.y * other.y + self.z * other.z
}

长度

/// 向量的长度
pub fn length(self) -> f64 {
    self.dot(self).sqrt()
}

单位向量

///  单位向量
pub fn unit(self) -> Vector3 {
    self / self.length()
}

总结

实现了向量的几种运算规则的函数。

附录

vector3.rs

use std::ops::{Add, Div, Mul, Sub};

pub type Color = Vector3;
pub type Point3 = Vector3;

#[derive(Default, Clone, Copy)]
pub struct Vector3 {
    x: f64,
    y: f64,
    z: f64,
}

impl Vector3 {
    pub fn new(x: f64, y: f64, z: f64) -> Self {
        Self { x, y, z }
    }

    pub fn format_str(self) -> String {
        let x = (255.999 * self.x) as u64;
        let y = (255.999 * self.y) as u64;
        let z = (255.999 * self.z) as u64;

        format!("{x} {y} {z}\n")
    }

    pub fn y(self) -> f64 {
        self.y
    }

    /// 向量的长度
    pub fn length(self) -> f64 {
        self.dot(self).sqrt()
    }

    /// 向量的点乘
    pub fn dot(self, other: Vector3) -> f64 {
        self.x * other.x + self.y * other.y + self.z * other.z
    }

    ///  单位向量
    pub fn unit(self) -> Vector3 {
        self / self.length()
    }
}

// 向量的加法
impl Add for Vector3 {
    type Output = Self;

    fn add(self, rhs: Self) -> Self {
        Vector3 {
            x: self.x + rhs.x,
            y: self.y + rhs.y,
            z: self.z + rhs.z,
        }
    }
}

// 向量的减法
impl Sub for Vector3 {
    type Output = Self;

    fn sub(self, rhs: Self) -> Self {
        Self {
            x: self.x - rhs.x,
            y: self.y - rhs.y,
            z: self.z - rhs.z,
        }
    }
}

// 向量和数字的乘法
impl Mul<f64> for Vector3 {
    type Output = Self;

    fn mul(self, rhs: f64) -> Self {
        Self {
            x: self.x * rhs,
            y: self.y * rhs,
            z: self.z * rhs,
        }
    }
}

// 向量和数字的乘法
impl Mul<Vector3> for f64 {
    type Output = Vector3;

    fn mul(self, rhs: Vector3) -> Vector3 {
        rhs * self
    }
}

// 向量的除法
impl Div<f64> for Vector3 {
    type Output = Self;

    fn div(self, rhs: f64) -> Self {
        Self {
            x: self.x / rhs,
            y: self.y / rhs,
            z: self.z / rhs,
        }
    }
}

标签:Vector3,Self,四则运算,rhs,fn,0191,self,向量
From: https://www.cnblogs.com/jiangbo4444/p/18307338

相关文章

  • 如何将文本转换为向量?(方法四)
    ​ 文本转换为向量有多种方式:方法一:通过模型服务灵积DashScope将文本转换为向量(推荐)方法二:通过ModelScope魔搭社区中的文本向量开源模型将文本转换为向量方法三:通过JinaEmbeddingsv2模型将文本转换为向量方法四:通过百川智能向量化模型将文本转换为向量本文介绍方法四:如......
  • 如何将文本转换为向量?(方法三)
    ​ 文本转换为向量有多种方式:方法一:通过模型服务灵积DashScope将文本转换为向量(推荐)方法二:通过ModelScope魔搭社区中的文本向量开源模型将文本转换为向量方法三:通过JinaEmbeddingsv2模型将文本转换为向量方法四:通过百川智能向量化模型将文本转换为向量本文介绍方法三:如......
  • 三大知名向量化模型比较分析——m3e,bge,bce
    先聊聊出处。M3E是MokaMassiveMixedEmbedding的缩写,Moka,此模型由MokaAI训练,开源和评测,训练脚本使用uniem,评测BenchMark使用MTEB-zhMassive,此模型通过千万级(2200w+)的中文句对数据集进行训练Mixed,此模型支持中英双语的同质文本相似度计算,异质文本检索等功......
  • 如何将文本转换为向量?(方法二)
    ​ 文本转换为向量有多种方式:方法一:通过模型服务灵积DashScope将文本转换为向量(推荐)方法二:通过ModelScope魔搭社区中的文本向量开源模型将文本转换为向量方法三:通过JinaEmbeddingsv2模型将文本转换为向量方法四:通过百川智能向量化模型将文本转换为向量 本文介绍方法二......
  • 0190-定义三维向量
    环境Time2022-11-14WSL-Ubuntu22.04Rust1.65.0前言说明参考:https://raytracing.github.io/books/RayTracingInOneWeekend.html目标将之前定义的三种颜色,封装到一个三维的向量中,保持原有的逻辑不变。main.rsusecrate::vector3::Color;modvector3;fnmain(){......
  • 数据库-SQL_duckdb向量化计算-vector
    duckdbDuckDB0.10.0引入了新的数据类型ArrayArray不同于Postgres的数组类型(Postgres的是可变长度的),DuckDB的Array列存储固定大小的数组目前相似度计算支持单精度浮点数(4字节)DuckDB的FLOAT4=numpy.float3目前vss功能还有待丰富--持续关注Vector向......
  • 乘积量化pq:将高维向量压缩 97%
    向量相似性搜索在处理大规模数据集时,往往面临着内存消耗的挑战。例如,即使是一个包含100万个密集向量的小数据集,其索引也可能需要数GB的内存。随着数据集规模的增长,尤其是高维数据,内存使用量会迅速增加,这可能导致内存管理问题。乘积量化(PQ)是一种流行的方法,能够显著压缩高维......
  • [namespace hdk] 向量 direct_vector
    我忏悔我有罪我心情又不好了不知道干什么所以又不小心封了个东西啊啊啊啊啊啊啊啊功能已重载[]运算符(右值)谁能教教我怎么把[]变成stl类似的左值表达式(直接返回地址需要在前面加*,挺麻烦的)已重载=运算符(可使用向量或std:::vector)已重载++=--=-(负号)*(点乘)*=(......
  • manim学习笔记04:使用manim,表示向量和加法。
    manim学习笔记04:使用manim,表示向量和加法。一,相关定义1.有向线段:规定若线段AB的端点为起点为A,B为终点,则线段就具有了从起点A到终点B的方向和长度。具有方向和长度的线段叫做有向线段。接下来我们体会一下相关的代码:classVectorArrow(Scene):defconstruct(self):......
  • 向量检索服务应用场景
    ​ 本文为您介绍向量检索服务在电商智能搜索和偏好推荐、自然语言处理等AI问答系统、图库类网站多模态搜索、视频检索、分子检测与筛选等场景下的应用。 电商智能搜索和偏好推荐场景在电商智能搜索和偏好推荐场景中,向量数据库可以实现基于向量相似度的搜索和推荐功能。例如......