[炼手Rust]矩阵转置

205 阅读1分钟

Hi,大家好,这里是炼手Rust专栏,我是xiaoK,今天来看个线性代数的简单问题:矩阵转置。

transposed-matrix.png

提问

编写一个输出矩阵转置的函数,即交换原始矩阵的列和行。

例:

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

  1. 通过Vec::with_capacity(col)可以构造一个至少具有指定容量的新的空Vec<T>,这样在push的时候,不会出现扩容的问题。即把Vec当做数据使用。