Domanda

Allora questa domanda è legata alla domanda trasformando formato matrice, scottatura Ma ora, voglio eseguire l'operazione sul retro.Quindi posso farlo in modo tale:

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

Ma, lì, abbiamo avuto problemi con zero.Come sappiamo, la scottatura salta i campi dei valori zero.Quindi, ad esempio, abbiamo ottenuto Matrix:

1   0   8   
4   5   6   
0   8   9
.

In formato scottatura è:

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

Usando la mia funzione Ho scritto sopra possiamo solo ottenere:

1   8
4   5   6
8   9
.

e questo è errato.Quindi, come posso affrontarlo?Vedo due possibili varianti:

    .
  1. Per trovare il modo, aggiungere zeri (in realtà, non dunno come inserire dati)
  2. Per scrivere le proprie operazioni sul proprio formato di matrice proprio (non è favoribile, perché sono interessato alle operazioni di matrice scottatura e non vogliono scriverle tutte le mie)
  3. MB Ci sono alcuni metodi, e posso evitare di saltare gli zeri in matrice?

È stato utile?

Soluzione

Screwing memorizza una rappresentazione sparsa dei dati.Se si desidera produrre una matrice densa (prima di tutto, che non si ridimensiona, perché le righe saranno più grandi di quelle che possono adattarsi in memoria ad un certo punto), è necessario enumerare tutte le righe e le colonne:

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top