最近Rustを学び始めて,現在以下のようなコードを書いています.

static TABLE:[[u8; 4]; 4] =[
    [ 3,  6,  7, 14],
    [ 1, 11, 13,  5],
    [ 8,  2,  4,  9],
    [10, 15,  0, 12]
];

fn main() {
    let mut input: [[u8; 2]; 4] = [[4, 8], [3, 10], [9, 1], [0, 3]];
    let output = func(input, TABLE);
    for row in output.iter() {
        for data in row.iter() {
            println!("{}", data);
        }
    }
}

fn func(input:[[u8; 2]; 4], table:[[u8; 4]; 4]) -> [[u8; 2]; 4] {
    let mut t = input.clone();
    for i in t.iter() {
        for j in i.iter() {
            let y = j % 4;
            let x = (j - y) / 4;
            j = table[x as usize][y as usize].clone();
        }
    }

    t;
}

funcは,二次元配列inputの要素の値(Z)から二次元配列tableの座標(X, Y)を算出して,Zをその値に書き換えた配列を新たに返すという関数です.

これをコンパイルしようとすると以下のエラーでコンパイルに失敗します.

src/main.rs:24:17: 24:54 error: mismatched types:
expected &u8, found u8
(expected &-ptr, found u8) [E0308]
src/main.rs:24 j = table[x as usize][y as usize].clone();

j は t[〜][〜] の値の参照で,それを書き換えることによって t にそれが反映されることを期待していたのですが,そのやり方が間違っているようで悩んでいます.

ちなみに以下のような出力を期待しています.

1
8
14
4
2
6
3
14

どのようにすればこのような出力を得られるでしょうか?