// 定义一个特质来表示向量元素可进行加法操作
trait Addable<T> {
fn add(&self, other: &T) -> T;
}
// 为i32类型实现Addable特质
impl Addable<i32> for i32 {
fn add(&self, other: &i32) -> i32 {
*self + *other
}
}
// 定义一个多维向量结构体
struct MultiDimVector<T> {
data: Vec<T>,
dimensions: Vec<usize>,
}
impl<T> MultiDimVector<T> {
// 创建一个新的多维向量
fn new(data: Vec<T>, dimensions: Vec<usize>) -> Self {
MultiDimVector { data, dimensions }
}
// 获取多维向量的维度
fn dimensions(&self) -> &[usize] {
&self.dimensions
}
// 获取多维向量的数据
fn data(&self) -> &[T] {
&self.data
}
// 元素求和(假设向量元素实现了Addable特质)
fn sum(&self) -> Option<T>
where
T: Clone + Addable<T>,
{
let mut result = self.data[0].clone();
for element in self.data.iter().skip(1) {
result = result.add(element);
}
Some(result)
}
}
// 矩阵转置(假设是二维向量)
impl<T> MultiDimVector<T> {
fn transpose(&self) -> Option<MultiDimVector<T>>
where
T: Clone,
{
if self.dimensions.len() != 2 {
return None;
}
let (rows, cols) = (self.dimensions[0], self.dimensions[1]);
let mut transposed_data = vec![Default::default(); rows * cols];
for i in 0..rows {
for j in 0..cols {
let index_original = i * cols + j;
let index_transposed = j * rows + i;
transposed_data[index_transposed] = self.data[index_original].clone();
}
}
Some(MultiDimVector::new(transposed_data, vec![cols, rows]))
}
}
// 三维向量的特定操作(例如,这里简单地打印出向量形状,可扩展为更复杂操作)
impl<T> MultiDimVector<T> {
fn print_3d_shape(&self) {
if self.dimensions.len() == 3 {
println!("3D Vector shape: {:?}", self.dimensions);
} else {
println!("Not a 3D vector.");
}
}
}
fn main() {
// 创建一个二维向量
let data_2d: Vec<i32> = vec![1, 2, 3, 4];
let dims_2d = vec![2, 2];
let vector_2d = MultiDimVector::new(data_2d, dims_2d);
// 转置二维向量
if let Some(transposed) = vector_2d.transpose() {
println!("Transposed 2D vector data: {:?}", transposed.data());
println!("Transposed 2D vector dimensions: {:?}", transposed.dimensions());
}
// 创建一个三维向量示例
let data_3d: Vec<i32> = vec![1, 2, 3, 4, 5, 6];
let dims_3d = vec![2, 3, 1];
let vector_3d = MultiDimVector::new(data_3d, dims_3d);
// 执行三维向量特定操作
vector_3d.print_3d_shape();
// 计算向量元素和
if let Some(sum_result) = vector_3d.sum() {
println!("Sum of vector elements: {}", sum_result);
}
}
设计思路
- 特质(Trait):定义
Addable
特质,确保向量元素类型实现加法操作,以便进行元素求和。
- 结构体(Struct):创建
MultiDimVector
结构体,包含向量数据 data
和维度信息 dimensions
。
- 方法(Methods):
new
方法用于创建新的多维向量。
dimensions
和 data
方法分别用于获取向量的维度和数据。
sum
方法用于计算向量元素的和,前提是元素类型实现了 Addable
特质。
transpose
方法用于转置二维向量,检查向量维度确保是二维向量才进行操作。
print_3d_shape
方法用于打印三维向量的形状。
类型安全保证
- 泛型(Generics):使用泛型
T
来支持不同类型的数据,使得代码具有通用性。
- 特质约束(Trait Bounds):在方法定义中使用特质约束,如
sum
方法要求 T
类型实现 Clone
和 Addable
特质,确保在编译时进行类型检查,避免运行时错误。
性能优化
- Vec使用:使用
Vec
存储向量数据,Vec
是 Rust 标准库中高效的动态数组,具有良好的内存管理和访问性能。
- 减少不必要复制:在方法实现中,尽量使用引用而不是复制数据,如
sum
方法中通过 clone
复制初始值后,后续通过引用进行加法操作,减少不必要的内存复制。
- 编译时优化:Rust 的编译器会在编译时进行大量优化,如内联函数、消除未使用代码等,进一步提高性能。