ネイティブマトリックスフォーマットからの変換、スカレイン
質問
だからこの質問は質問に関連しています。>
しかし今、私はバック操作をしたいです。だから私はそのような方法でそれを作ることができます:
Tsv(in, ('row, 'col, 'v))
.read
.groupBy('row) { _.sortBy('col).mkString('v, "\t") }
.mapTo(('row, 'v) -> ('c)) { res : (Long, String) =>
val (row, v) = res
v }
.write(Tsv(out))
.
しかし、そこにはゼロに問題がありました。私たちが知っているように、スカレはゼロ値のフィールドをスキップします。それでは、例えばマトリックスを手に入れました:
1 0 8
4 5 6
0 8 9
.
スカルディング形式は次のとおりです。
1 1 1
1 3 8
2 1 4
2 2 5
2 3 6
3 2 8
3 3 9
.
私の関数を使って私は上記に書いています:
1 8
4 5 6
8 9
.
とそれが間違っています。だから、どのように私はそれに対処することができますか?2つの可能な亜種が見られます:
- ゼロを追加するには、(実際にはDunno、挿入データ)
- 自身の操作を自分の行列形式で書くために(好ましくない、スカルディングマトリックス操作に興味があり、私自身のすべてのものを書きたくない)
mb rメソッドはいくつかの方法で、そして私はマトリックス中のゼロのスキップを避けることができますか?
解決
Skaldingはデータの疎な表現を格納します。密な行列を出力したい場合(まず、スケールではありません。行は、ある時点でメモリに収まるよりも大きくなるため)、すべての行と列を列挙する必要があります。
// First, I highly suggest you use the TypedPipe api, as it is easier to get
// big jobs right generally
val mat = // has your matrix in 'row1, 'col1, 'val1
def zero: V = // the zero of your value type
val rows = IterableSource(0 to 1000, 'row)
val cols = IterableSource(0 to 2000, 'col)
rows.crossWithTiny(cols)
.leftJoinWithSmaller(('row, 'col) -> ('row1, 'col1), mat)
.map('val1 -> 'val1) { v: V =>
if(v == null) // this value should be 0 in your type:
zero
else
v
}
.groupBy('row) {
_.toList[(Int, V)](('col, 'val1) -> 'cols)
}
.map('cols -> 'cols) { cols: List[(Int, V)] =>
cols.sortBy(_._1).map(_._2).mkString("\t")
}
.write(TypedTsv[(Int, String)]("output"))
. 所属していません StackOverflow