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

Function ComputeDiagonalBlockP

lib/PBA/SparseBundleCPU.cpp:1789–1846  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

1787
1788template <class Float>
1789void ComputeDiagonalBlockP(size_t npt, float lambda1, float lambda2,
1790 const Float* jp, const int* pmap, Float* di,
1791 Float* bi, int mt) {
1792 if (mt > 1) {
1793 MYTHREAD threads[THREAD_NUM_MAX];
1794 const size_t thread_num = std::min(mt, THREAD_NUM_MAX);
1795 for (size_t i = 0; i < thread_num; ++i) {
1796 size_t first = npt * i / thread_num;
1797 size_t last_ = npt * (i + 1) / thread_num;
1798 size_t last = std::min(last_, npt);
1799 RUN_THREAD(ComputeDiagonalBlockP, threads[i], (last - first), lambda1,
1800 lambda2, jp, pmap + first, di + POINT_ALIGN * first,
1801 bi + 6 * first);
1802 }
1803 WAIT_THREAD(threads, thread_num);
1804 } else {
1805 for (size_t i = 0; i < npt; ++i, ++pmap, di += POINT_ALIGN, bi += 6) {
1806 int idx1 = pmap[0], idx2 = pmap[1];
1807
1808 Float M00 = 0, M01 = 0, M02 = 0, M11 = 0, M12 = 0, M22 = 0;
1809 const Float *jxp = jp + idx1 * (POINT_ALIGN2), *jyp = jxp + POINT_ALIGN;
1810 for (int j = idx1; j < idx2;
1811 ++j, jxp += POINT_ALIGN2, jyp += POINT_ALIGN2) {
1812 M00 += (jxp[0] * jxp[0] + jyp[0] * jyp[0]);
1813 M01 += (jxp[0] * jxp[1] + jyp[0] * jyp[1]);
1814 M02 += (jxp[0] * jxp[2] + jyp[0] * jyp[2]);
1815 M11 += (jxp[1] * jxp[1] + jyp[1] * jyp[1]);
1816 M12 += (jxp[1] * jxp[2] + jyp[1] * jyp[2]);
1817 M22 += (jxp[2] * jxp[2] + jyp[2] * jyp[2]);
1818 }
1819
1820 /////////////////////////////////
1821 di[0] = M00;
1822 di[1] = M11;
1823 di[2] = M22;
1824
1825 /////////////////////////////
1826 M00 = M00 * lambda2 + lambda1;
1827 M11 = M11 * lambda2 + lambda1;
1828 M22 = M22 * lambda2 + lambda1;
1829
1830 ///////////////////////////////
1831 Float det = (M00 * M11 - M01 * M01) * M22 + Float(2.0) * M01 * M12 * M02 -
1832 M02 * M02 * M11 - M12 * M12 * M00;
1833 if (det >= FLT_MAX || det <= FLT_MIN * 2.0f) {
1834 // SetVectorZero(bi, bi + 6);
1835 for (int j = 0; j < 6; ++j) bi[j] = 0;
1836 } else {
1837 bi[0] = (M11 * M22 - M12 * M12) / det;
1838 bi[1] = -(M01 * M22 - M12 * M02) / det;
1839 bi[2] = (M01 * M12 - M02 * M11) / det;
1840 bi[3] = (M00 * M22 - M02 * M02) / det;
1841 bi[4] = -(M00 * M12 - M01 * M02) / det;
1842 bi[5] = (M00 * M11 - M01 * M01) / det;
1843 }
1844 }
1845 }
1846}

Callers 2

ComputeDiagonalBlockFunction · 0.85

Calls

no outgoing calls

Tested by

no test coverage detected