MCPcopy Create free account
hub / github.com/XiaoBaiiiiii/colmap-pcd / ComputeDiagonal

Function ComputeDiagonal

lib/PBA/SparseBundleCPU.cpp:1596–1644  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

1594///////////////////////////////////////
1595template <class Float>
1596void 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
1646template <class T, int n, int m>
1647void InvertSymmetricMatrix(T a[n][m], T ai[n][m]) {

Callers 4

ComputeDiagonalMethod · 0.85
ComputeDiagonalMethod · 0.85

Calls 4

SetVectorZeroFunction · 0.85
sizeMethod · 0.45
beginMethod · 0.45
endMethod · 0.45

Tested by

no test coverage detected