From 3e60a998ac970da659d590bac2ff892ee619aa1b Mon Sep 17 00:00:00 2001 From: Richard Bowen Date: Tue, 1 Apr 2014 16:22:49 -0700 Subject: [PATCH] Added support and tests: row and column blocks for sparse matrix transpose. Change-Id: Ife641b08a9e86826478521a405f21ba60667f0e8 --- .../ceres/compressed_row_sparse_matrix.cc | 3 +++ .../compressed_row_sparse_matrix_test.cc | 22 +++++++++++++++++++ 2 files changed, 25 insertions(+) diff --git a/internal/ceres/compressed_row_sparse_matrix.cc b/internal/ceres/compressed_row_sparse_matrix.cc index 34f31ab6c..bef98d6fa 100644 --- a/internal/ceres/compressed_row_sparse_matrix.cc +++ b/internal/ceres/compressed_row_sparse_matrix.cc @@ -377,6 +377,9 @@ CompressedRowSparseMatrix* CompressedRowSparseMatrix::Transpose() const { } transpose_rows[0] = 0; + *(transpose->mutable_row_blocks()) = col_blocks_; + *(transpose->mutable_col_blocks()) = row_blocks_; + return transpose; } diff --git a/internal/ceres/compressed_row_sparse_matrix_test.cc b/internal/ceres/compressed_row_sparse_matrix_test.cc index ea737b8d0..999a661a4 100644 --- a/internal/ceres/compressed_row_sparse_matrix_test.cc +++ b/internal/ceres/compressed_row_sparse_matrix_test.cc @@ -338,10 +338,22 @@ TEST(CompressedRowSparseMatrix, Transpose) { // 13 0 14 15 9 0 // 0 16 17 0 0 0 + // Block structure: + // A A A A B B + // A A A A B B + // A A A A B B + // C C C C D D + // C C C C D D + // C C C C D D + CompressedRowSparseMatrix matrix(5, 6, 30); int* rows = matrix.mutable_rows(); int* cols = matrix.mutable_cols(); double* values = matrix.mutable_values(); + matrix.mutable_row_blocks()->push_back(3); + matrix.mutable_row_blocks()->push_back(3); + matrix.mutable_col_blocks()->push_back(4); + matrix.mutable_col_blocks()->push_back(2); rows[0] = 0; cols[0] = 1; @@ -376,6 +388,16 @@ TEST(CompressedRowSparseMatrix, Transpose) { scoped_ptr transpose(matrix.Transpose()); + ASSERT_EQ(transpose->row_blocks().size(), matrix.col_blocks().size()); + for (int i = 0; i < transpose->row_blocks().size(); ++i) { + EXPECT_EQ(transpose->row_blocks()[i], matrix.col_blocks()[i]); + } + + ASSERT_EQ(transpose->col_blocks().size(), matrix.row_blocks().size()); + for (int i = 0; i < transpose->col_blocks().size(); ++i) { + EXPECT_EQ(transpose->col_blocks()[i], matrix.row_blocks()[i]); + } + Matrix dense_matrix; matrix.ToDenseMatrix(&dense_matrix);