Hi,大家好,这里是炼手Rust专栏,我是xiaoK,今天来看个线性代数的简单问题:矩阵转置。
提问
编写一个输出矩阵转置的函数,即交换原始矩阵的列和行。
例:
input:
| 1 2 3 |
| 4 5 6 |
output:
| 1 4 |
| 2 5 |
| 3 6 |
模板:
fn transpose(matrix: &[Vec<u8>]) -> Vec<Vec<u8>> { }
分析
在线性代数中,矩阵的转置即交换原矩阵中的行和列,行向量变列向量,列向量变行向量即可。那么,代码逻辑就非常简单了,遍历列,输入新矩阵的行即可。
解决方案
fn transpose(matrix: &[Vec<u8>]) -> Vec<Vec<u8>> {
let row = matrix.len();
let col = matrix[0].len();
let mut transpose:Vec<Vec<u8>> = Vec::with_capacity(col);
for c in 0..col {
let mut rows = Vec::with_capacity(row);
for r in 0..row {
rows.push(matrix[r][c]);
}
transpose.push(rows);
}
transpose
}
Trick
- 通过
Vec::with_capacity(col)可以构造一个至少具有指定容量的新的空Vec<T>,这样在push的时候,不会出现扩容的问题。即把Vec当做数据使用。