| 1594 | /////////////////////////////////////// |
| 1595 | template <class Float> |
| 1596 | void ComputeDiagonal(const avec<Float>& jcv, const vector<int>& cmapv, |
| 1597 | const avec<Float>& jpv, const vector<int>& pmapv, |
| 1598 | const vector<int>& cmlistv, const Float* qw0, |
| 1599 | avec<Float>& jtjdi, bool jc_transpose, int radial) { |
| 1600 | // first camera part |
| 1601 | if (jcv.size() == 0 || jpv.size() == 0) return; // not gonna happen |
| 1602 | |
| 1603 | size_t ncam = cmapv.size() - 1, npts = pmapv.size() - 1; |
| 1604 | const int vn = radial ? 8 : 7; |
| 1605 | SetVectorZero(jtjdi); |
| 1606 | |
| 1607 | const int* cmap = &cmapv[0]; |
| 1608 | const int* pmap = &pmapv[0]; |
| 1609 | const int* cmlist = &cmlistv[0]; |
| 1610 | const Float* jc = &jcv[0]; |
| 1611 | const Float* jp = &jpv[0]; |
| 1612 | const Float* qw = qw0; |
| 1613 | Float* jji = &jtjdi[0]; |
| 1614 | |
| 1615 | ///////compute jc part |
| 1616 | for (size_t i = 0; i < ncam; ++i, jji += 8, ++cmap, qw += 2) { |
| 1617 | int idx1 = cmap[0], idx2 = cmap[1]; |
| 1618 | ////////////////////////////////////// |
| 1619 | for (int j = idx1; j < idx2; ++j) { |
| 1620 | int idx = jc_transpose ? j : cmlist[j]; |
| 1621 | const Float* pj = jc + idx * 16; |
| 1622 | /////////////////////////////////////////// |
| 1623 | for (int k = 0; k < vn; ++k) |
| 1624 | jji[k] += (pj[k] * pj[k] + pj[k + 8] * pj[k + 8]); |
| 1625 | } |
| 1626 | if (qw0 && qw[0] > 0) { |
| 1627 | jji[0] += (qw[0] * qw[0] * 2.0f); |
| 1628 | jji[7] += (qw[1] * qw[1] * 2.0f); |
| 1629 | } |
| 1630 | } |
| 1631 | |
| 1632 | for (size_t i = 0; i < npts; ++i, jji += POINT_ALIGN, ++pmap) { |
| 1633 | int idx1 = pmap[0], idx2 = pmap[1]; |
| 1634 | const Float* pj = jp + idx1 * POINT_ALIGN2; |
| 1635 | for (int j = idx1; j < idx2; ++j, pj += POINT_ALIGN2) { |
| 1636 | for (int k = 0; k < 3; ++k) |
| 1637 | jji[k] += (pj[k] * pj[k] + pj[k + POINT_ALIGN] * pj[k + POINT_ALIGN]); |
| 1638 | } |
| 1639 | } |
| 1640 | Float* it = jtjdi.begin(); |
| 1641 | for (; it < jtjdi.end(); ++it) { |
| 1642 | *it = (*it == 0) ? 0 : Float(1.0 / (*it)); |
| 1643 | } |
| 1644 | } |
| 1645 | |
| 1646 | template <class T, int n, int m> |
| 1647 | void InvertSymmetricMatrix(T a[n][m], T ai[n][m]) { |
no test coverage detected