[Numerics] Fix invalid memory access in DenseMatrix increment

This method now works for rectangular matrices
This commit is contained in:
Ray Speth 2016-04-09 22:19:10 -04:00
parent bd24aeb926
commit 7af1b4b60f
2 changed files with 22 additions and 1 deletions

View file

@ -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<int>(A.nRows()), static_cast<int>(A.nRows()), 1.0,
static_cast<int>(A.nRows()), static_cast<int>(A.nColumns()), 1.0,
A.ptrColumn(0), static_cast<int>(A.nRows()), b, 1, 1.0, prod, 1);
}

View file

@ -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]);
}
}