Skip to content

Commit

Permalink
[SPARK-5322] Added transpose functionality to BlockMatrix
Browse files Browse the repository at this point in the history
BlockMatrices can now be transposed!

Author: Burak Yavuz <brkyvz@gmail.com>

Closes apache#4275 from brkyvz/SPARK-5322 and squashes the following commits:

33806ed [Burak Yavuz] added lazy comment
33e9219 [Burak Yavuz] made transpose lazy
5a274cd [Burak Yavuz] added cached tests
5dcf85c [Burak Yavuz] [SPARK-5322] Added transpose functionality to BlockMatrix
  • Loading branch information
brkyvz authored and mengxr committed Jan 30, 2015
1 parent 80def9d commit dd4d84c
Show file tree
Hide file tree
Showing 2 changed files with 38 additions and 0 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -232,6 +232,15 @@ class BlockMatrix(
new DenseMatrix(m, n, values)
}

/** Transpose this `BlockMatrix`. Returns a new `BlockMatrix` instance sharing the
* same underlying data. Is a lazy operation. */
def transpose: BlockMatrix = {
val transposedBlocks = blocks.map { case ((blockRowIndex, blockColIndex), mat) =>
((blockColIndex, blockRowIndex), mat.transpose)
}
new BlockMatrix(transposedBlocks, colsPerBlock, rowsPerBlock, nCols, nRows)
}

/** Collects data and assembles a local dense breeze matrix (for test only). */
private[mllib] def toBreeze(): BDM[Double] = {
val localMat = toLocalMatrix()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -146,4 +146,33 @@ class BlockMatrixSuite extends FunSuite with MLlibTestSparkContext {
assert(gridBasedMat.toLocalMatrix() === dense)
assert(gridBasedMat.toBreeze() === expected)
}

test("transpose") {
val expected = BDM(
(1.0, 0.0, 3.0, 0.0, 0.0),
(0.0, 2.0, 1.0, 1.0, 0.0),
(0.0, 1.0, 1.0, 2.0, 1.0),
(0.0, 0.0, 0.0, 1.0, 5.0))

val AT = gridBasedMat.transpose
assert(AT.numRows() === gridBasedMat.numCols())
assert(AT.numCols() === gridBasedMat.numRows())
assert(AT.toBreeze() === expected)

// partitioner must update as well
val originalPartitioner = gridBasedMat.partitioner
val ATpartitioner = AT.partitioner
assert(originalPartitioner.colsPerPart === ATpartitioner.rowsPerPart)
assert(originalPartitioner.rowsPerPart === ATpartitioner.colsPerPart)
assert(originalPartitioner.cols === ATpartitioner.rows)
assert(originalPartitioner.rows === ATpartitioner.cols)

// make sure it works when matrices are cached as well
gridBasedMat.cache()
val AT2 = gridBasedMat.transpose
AT2.cache()
assert(AT2.toBreeze() === AT.toBreeze())
val A = AT2.transpose
assert(A.toBreeze() === gridBasedMat.toBreeze())
}
}

0 comments on commit dd4d84c

Please sign in to comment.