简单 Rust 程序,实现两个向量相加
Source: Dev.to
线性代数是现代计算的支柱。GPU 利用向量相加来计算像素位置和实时 3D 渲染的光照。同样,LLM 将词语表示为高维向量(嵌入),通过数学运算来确定语义关系。
注意: 线性代数很快就会变得抽象。3Blue1Brown 的这段视频是该主题最好的入门之一:
https://www.youtube.com/watch?v=fNk_zzaMoSs&t=309s
Rust 程序:向量相加
use std::io::{self, Write};
fn main() {
let vec1 = get_vec("Enter first vector (x,y): ");
let vec2 = get_vec("Enter second vector (x,y): ");
println!("Result: ({}, {})", vec1.0 + vec2.0, vec1.1 + vec2.1);
}
fn get_vec(msg: &str) -> (f32, f32) {
print!("{}", msg);
io::stdout().flush().unwrap();
let mut input = String::new();
io::stdin().read_line(&mut input).unwrap();
let coords: Vec = input
.split(',')
.map(|s| s.trim().parse().unwrap_or(0.0))
.collect();
(coords[0], coords[1])
}
将文件保存为 add_vectors.rs。
编译程序
rustc add_vectors.rs
运行程序
./add_vectors
示例交互
Enter first vector (x,y): 1,2
Enter second vector (x,y): 3,-1
Result: (4, 1)
在方格纸上复现此过程可以帮助你直观地看到向量相加的过程,提升理解。
Rust 逐行解析
use std::io::{self, Write};
导入 I/O trait。Write 用于刷新缓冲区,使提示立即显示。
fn main() { ... }
标准入口点,程序从这里开始执行。
let vec1 = ... 和 let vec2 = ...
变量绑定。let 创建不可变绑定,捕获 get_vec 返回的向量。
println!(...)
声明式宏(注意 !),将格式化文本打印到控制台。{} 是值的占位符。
fn get_vec(msg: &str) -> (f32, f32)
函数签名,定义一个返回两个 32 位浮点数元组的辅助函数。
print!("{}", msg); io::stdout().flush().unwrap();
打印提示并立即刷新 stdout,使用户在输入前看到提示。
io::stdin().read_line(&mut input).unwrap();
从标准输入读取一行到可变的 String 中。&mut 让函数可以修改该变量。unwrap() 在读取失败时会 panic。
input.split(',').map(...).collect();
创建一个迭代器,以逗号分割输入,对每段进行修剪、解析为 f32,并收集到 Vec 中。
parse().unwrap_or(0.0)
尝试将修剪后的字符串切片转换为浮点数。如果解析失败,则返回 0.0 而不是 panic。
(coords[0], coords[1])
返回向量的前两个元素,作为表示 (x, y) 坐标的元组。