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