これやりたくなるときありますよね。
転置行列(てんちぎょうれつ、英: transpose [of a matrix], transposed matrix)とは、m 行 n 列の行列 A に対して A の (i, j) 要素と (j, i) 要素を入れ替えてできる n 行 m 列の行列のことである。転置行列は tA, AT, A⊤, Atr, A′ などと示される。行列の転置行列を与える操作のことを転置(てんち、英: transpose)といい、「A を転置する」などと表現する
👉 転置行列 - Wikipedia
これを、変換すると、
[
[1, 2, 3, 4, 5],
["A", "B", "C", "D", "E"],
["あ", "い", "う", "え", "お"],
["か", "き", "く", "け", "こ"]
]
こうなるやつ。
[
[1, "A", "あ", "か"],
[2, "B", "い", "き"],
[3, "C", "う", "く"],
[4, "D", "え", "け"],
[5, "E", "お", "こ"]
]
Swift で、extension で、やってみます。
🔄 配列系のプロトコルは多すぎないか
Xcode の反応をみながら、とりあえずいけた。
縦横インデックスを
きれいに .indecies で取りたかったけど、
うまく取れなかった。
extension Collection where Element: Collection,
Self.Index == Int, Element.Index == Int {
func transposed1() -> [[Element.Element]] {
let cols = 0 ..< (self.first?.count ?? 0)
let rows = 0 ..< self.count
var result: [[Element.Element]] = []
for col in cols {
var newRow: [Element.Element] = []
for row in rows {
newRow.append(self[row][col])
}
result.append(newRow)
}
return result
}
}
// [[1, "A", "あ", "か"], [2, "B", "い", "き"], [3, "C", "う", "く"], [4, "D", "え", "け"], [5, "E", "お", "こ"]]
Array とか Collection。
where 句 や Element。
書きながらでないと、きっと理解できない感じがする。
👉 Collection | Apple Developer Documentation
🔄 for ループ を map に
「空配列を作成して要素追加」てのがなんとなくだるいので、
map を使います。
入れ子なので「$0」は使いません。
func transposed2() -> [[Element.Element]] {
let cols = 0 ..< (self.first?.count ?? 0)
let rows = 0 ..< self.count
return cols.map { col in
rows.map { row in
self[row][col]
}
}
}
すぐに、return から始めたいので、
最初の let を省略。
func transposed3() -> [[Element.Element]] {
return (0 ..< (first?.count ?? 0)).map { col in
(0 ..< count).map { row in
self[row][col]
}
}
}
ここまででいいか。
🔄 まとめ
まとめておきます。
また、勉強したら更新します。
Swift の「プロトコル」ってなんか高級。
👉 あなたの知らないCollectionの世界 #Swift - Qiita