Question

Cette question est donc liée à la question transformation de format matriciel, brûlage

Mais maintenant, je veux faire l'opération du dos.Donc, je peux le faire de la sorte:

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))

Mais, là, nous avons eu un problème avec les zéros.Comme nous le savons, Sourding Skips Skips Zero Valeurs champs.Donc, par exemple, nous avons eu matrice:

1   0   8   
4   5   6   
0   8   9

au format brûlant est:

1   1   1
1   3   8
2   1   4
2   2   5
2   3   6
3   2   8
3   3   9

Utilisation de ma fonction J'ai écrit ci-dessus, nous ne pouvons obtenir que:

1   8
4   5   6
8   9

Et c'est incorrect.Alors, comment puis-je y faire face?Je vois deux variantes possibles:

  1. Pour trouver la voie, pour ajouter des zéros (en fait, Dunno Comment insérer Data)
  2. Pour écrire ses propres opérations sur son propre format matriciel (il est impérable, car je m'intéresse aux opérations matricielles brûlantes et que vous ne voulez pas écrire toutes les miennes)
  3. MB Il y a quelques méthodes, et je peux éviter de sauter des zéros dans matrice?

Était-ce utile?

La solution

Structure stocke une représentation clairsemée des données.Si vous souhaitez générer une matrice dense (tout d'abord, cela ne sera pas à l'échelle, car les lignes seront plus grandes que cela ne peut s'adapter à la mémoire à un moment donné), vous devrez énumérer toutes les lignes et toutes les colonnes:

// 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"))

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top