我是Rust的新手,编写了一个二进制矩阵上的线性代数库.我有一个稀疏矩阵 struct ,它以列主格式(CscMatrix)存储一个矩阵.CscMatrix存储每列中1的位置,每列占据‘1’向量中的一个连续段.第i列的第一个条目的索引存储在开始[i]处.现在,我希望能够转置这样一个矩阵,并以行主格式接收结果(CsrMatrix的一个实例,它做的事情与CscMatrix完全相同,只是每一行占据‘one’中的一个连续段).当然,要做到这一点,不需要进行实际计算,只需将存储在CscMatrix中的数据重新解释为CsrMatrix即可.
pub struct CscMatrix {
start: Vec<u32>, // start index of each column in 'ones'
ones: Vec<u32>, // positions of ones
}
pub struct CsrMatrix {
start: Vec<u32>, // start index of each row in 'ones'
ones: Vec<u32>, // positions of ones
}
impl CscMatrix {
pub fn transpose(&self) -> CsrMatrix {
return CsrMatrix {
start: self.start,
ones: self.ones,
};
}
}
给定的CscMatrix始终是不可变的,并且返回的CsrMatrix不会被修改.
我现在的两个问题是:
- 我是否可以使用与给定CscMatrix中完全相同的数据来初始化CsrMatrix的‘Start’和‘one’向量,而不必复制它?直观地说,这应该是可能的,因为我不想修改返回的CsrMatrix,并且给定的CscMatrix是不可变的.因此,只需复制"开始"和"一"指向的内存位置的指针即可.
- 我可以让转置函数返回对创建的CsrMatrix对象的不可变引用吗?