1. A method for reading from memory, the method comprising: receiving a read word from a block of memory cells, wherein physical characteristics of the memory cells in the block support different sets of data levels; separating the read word into a plurality of virtual read vectors; performing for each of the virtual read vectors: identifying a codebook that was utilized to generate the virtual read vector; and generating a partial read data vector, the generating including multiplying the virtual read vector by a matrix that represents the codebook; combining the partial read data vectors into a read message; and outputting the read message.