Use faster version of in-place add
parent
50ffeb7dcd
commit
15fda68c1a
|
@ -552,6 +552,18 @@ VectorValues JacobianFactor::hessianDiagonal() const {
|
||||||
void JacobianFactor::hessianDiagonalAdd(VectorValues& d) const {
|
void JacobianFactor::hessianDiagonalAdd(VectorValues& d) const {
|
||||||
for (size_t pos = 0; pos < size(); ++pos) {
|
for (size_t pos = 0; pos < size(); ++pos) {
|
||||||
Key j = keys_[pos];
|
Key j = keys_[pos];
|
||||||
|
auto item = d.find(j);
|
||||||
|
|
||||||
|
if(item != d.end()) {
|
||||||
|
size_t nj = Ab_(pos).cols();
|
||||||
|
Vector& dj = item->second;
|
||||||
|
for (size_t k = 0; k < nj; ++k) {
|
||||||
|
Vector column_k = Ab_(pos).col(k);
|
||||||
|
if (model_)
|
||||||
|
model_->whitenInPlace(column_k);
|
||||||
|
dj(k) += dot(column_k, column_k);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
size_t nj = Ab_(pos).cols();
|
size_t nj = Ab_(pos).cols();
|
||||||
Vector dj(nj);
|
Vector dj(nj);
|
||||||
for (size_t k = 0; k < nj; ++k) {
|
for (size_t k = 0; k < nj; ++k) {
|
||||||
|
@ -560,10 +572,7 @@ void JacobianFactor::hessianDiagonalAdd(VectorValues& d) const {
|
||||||
model_->whitenInPlace(column_k);
|
model_->whitenInPlace(column_k);
|
||||||
dj(k) = dot(column_k, column_k);
|
dj(k) = dot(column_k, column_k);
|
||||||
}
|
}
|
||||||
auto item = d.find(j);
|
|
||||||
if(item != d.end()) {
|
|
||||||
item->second += dj;
|
|
||||||
} else {
|
|
||||||
d.emplace(j, dj);
|
d.emplace(j, dj);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue