두 벡터를 더하는 간단한 Rust 프로그램
Source: Dev.to
선형대수는 현대 컴퓨팅의 근간입니다. GPU는 벡터 덧셈을 이용해 실시간 3D 렌더링에서 픽셀 위치와 조명을 계산합니다. 마찬가지로 LLM은 단어를 고차원 벡터(임베딩)로 표현하고, 수학적 연산을 통해 의미적 관계를 판단합니다.
Note: 선형대수는 매우 빨리 추상화됩니다. 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 트레이트를 가져옵니다. 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()은 읽기에 실패하면 패닉을 일으킵니다.
input.split(',').map(...).collect();
입력을 콤마(,) 기준으로 나누는 이터레이터를 만들고, 각 조각을 트림한 뒤 f32로 파싱하고, 결과를 Vec에 수집합니다.
parse().unwrap_or(0.0)
트림된 문자열 슬라이스를 부동소수점으로 변환을 시도합니다. 파싱에 실패하면 패닉 대신 0.0을 반환합니다.
(coords[0], coords[1])
벡터의 첫 두 요소를 튜플로 반환하여 (x, y) 좌표를 나타냅니다.