Added support and tests: row and column blocks for sparse matrix transpose. Change-Id: Ife641b08a9e86826478521a405f21ba60667f0e8
diff --git a/internal/ceres/compressed_row_sparse_matrix.cc b/internal/ceres/compressed_row_sparse_matrix.cc index 34f31ab..bef98d6 100644 --- a/internal/ceres/compressed_row_sparse_matrix.cc +++ b/internal/ceres/compressed_row_sparse_matrix.cc
@@ -377,6 +377,9 @@ } 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 ea737b8..999a661 100644 --- a/internal/ceres/compressed_row_sparse_matrix_test.cc +++ b/internal/ceres/compressed_row_sparse_matrix_test.cc
@@ -338,10 +338,22 @@ // 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 @@ scoped_ptr<CompressedRowSparseMatrix> 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);