From 7af1b4b60fe8c63fb725ffea86b3810eed5ef579 Mon Sep 17 00:00:00 2001 From: Ray Speth Date: Sat, 9 Apr 2016 22:19:10 -0400 Subject: [PATCH] [Numerics] Fix invalid memory access in DenseMatrix increment This method now works for rectangular matrices --- src/numerics/DenseMatrix.cpp | 2 +- test/general/test_matrices.cpp | 21 +++++++++++++++++++++ 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/src/numerics/DenseMatrix.cpp b/src/numerics/DenseMatrix.cpp index 53b84c34c..046f9a291 100644 --- a/src/numerics/DenseMatrix.cpp +++ b/src/numerics/DenseMatrix.cpp @@ -191,7 +191,7 @@ void multiply(const DenseMatrix& A, const double* const b, double* const prod) void increment(const DenseMatrix& A, const double* b, double* prod) { ct_dgemv(ctlapack::ColMajor, ctlapack::NoTranspose, - static_cast(A.nRows()), static_cast(A.nRows()), 1.0, + static_cast(A.nRows()), static_cast(A.nColumns()), 1.0, A.ptrColumn(0), static_cast(A.nRows()), b, 1, 1.0, prod, 1); } diff --git a/test/general/test_matrices.cpp b/test/general/test_matrices.cpp index b4caa747c..0d3fd3726 100644 --- a/test/general/test_matrices.cpp +++ b/test/general/test_matrices.cpp @@ -179,3 +179,24 @@ TEST_F(DenseMatrixTest, matrix_times_matrix) A2.mult(A3, c); EXPECT_DOUBLE_EQ(4014, special_sum(c)); } + +TEST_F(DenseMatrixTest, increment) +{ + vector_fp c(b1.size(), 3.0); + increment(A1, x4.data(), c.data()); + for (size_t i = 0; i < 4; i++) { + EXPECT_DOUBLE_EQ(3.0 + b1[i], c[i]); + } + + c.assign(b2.size(), 3.0); + increment(A2, x3.data(), c.data()); + for (size_t i = 0; i < 4; i++) { + EXPECT_DOUBLE_EQ(3.0 + b2[i], c[i]); + } + + c.assign(b3.size(), 3.0); + increment(A3, x4.data(), c.data()); + for (size_t i = 0; i < 3; i++) { + EXPECT_DOUBLE_EQ(3.0 + b3[i], c[i]); + } +}