pinv_3x3.cpp
Go to the documentation of this file.
1 // License: Apache 2.0. See LICENSE file in root directory.
2 // Copyright(c) 2020 Intel Corporation. All Rights Reserved.
3 
4 // Code generated by Matlab Coder
5 
6 #include "utils.h"
7 #include <limits>
8 #include <cmath>
9 #include <cstring>
10 
11 
12 namespace
13 {
14 
15  static inline bool rtIsNaN( double value ) { return (value != value); }
16  static inline bool rtIsInf( double value )
17  {
18  return (value == std::numeric_limits< double >::infinity()
19  || value == -std::numeric_limits< double >::infinity());
20  }
21 
22  double b_xnrm2( int n, const double x[3], int ix0 )
23  {
24  double y;
25  double scale;
26  int kend;
27  int k;
28  double absxk;
29  double t;
30  y = 0.0;
31  if( n >= 1 )
32  {
33  if( n == 1 )
34  {
35  y = std::abs( x[ix0 - 1] );
36  }
37  else
38  {
39  scale = 3.3121686421112381E-170;
40  kend = ( ix0 + n ) - 1;
41  for( k = ix0; k <= kend; k++ )
42  {
43  absxk = std::abs( x[k - 1] );
44  if( absxk > scale )
45  {
46  t = scale / absxk;
47  y = 1.0 + y * t * t;
48  scale = absxk;
49  }
50  else
51  {
52  t = absxk / scale;
53  y += t * t;
54  }
55  }
56 
57  y = scale * std::sqrt( y );
58  }
59  }
60 
61  return y;
62  }
63 
64  double xnrm2( int n, const double x[9], int ix0 )
65  {
66  double y;
67  double scale;
68  int kend;
69  int k;
70  double absxk;
71  double t;
72  y = 0.0;
73  if( n >= 1 )
74  {
75  if( n == 1 )
76  {
77  y = std::abs( x[ix0 - 1] );
78  }
79  else
80  {
81  scale = 3.3121686421112381E-170;
82  kend = ( ix0 + n ) - 1;
83  for( k = ix0; k <= kend; k++ )
84  {
85  absxk = std::abs( x[k - 1] );
86  if( absxk > scale )
87  {
88  t = scale / absxk;
89  y = 1.0 + y * t * t;
90  scale = absxk;
91  }
92  else
93  {
94  t = absxk / scale;
95  y += t * t;
96  }
97  }
98 
99  y = scale * std::sqrt( y );
100  }
101  }
102 
103  return y;
104  }
105 
106  void b_xaxpy( int n, double a, const double x[9], int ix0, double y[3], int iy0 )
107  {
108  int ix;
109  int iy;
110  int i3;
111  int k;
112  if( ( n < 1 ) || ( a == 0.0 ) )
113  {
114  }
115  else
116  {
117  ix = ix0 - 1;
118  iy = iy0 - 1;
119  i3 = n - 1;
120  for( k = 0; k <= i3; k++ )
121  {
122  y[iy] += a * x[ix];
123  ix++;
124  iy++;
125  }
126  }
127  }
128 
129  void c_xaxpy( int n, double a, const double x[3], int ix0, double y[9], int iy0 )
130  {
131  int ix;
132  int iy;
133  int i4;
134  int k;
135  if( ( n < 1 ) || ( a == 0.0 ) )
136  {
137  }
138  else
139  {
140  ix = ix0 - 1;
141  iy = iy0 - 1;
142  i4 = n - 1;
143  for( k = 0; k <= i4; k++ )
144  {
145  y[iy] += a * x[ix];
146  ix++;
147  iy++;
148  }
149  }
150  }
151 
152  void xaxpy( int n, double a, int ix0, double y[9], int iy0 )
153  {
154  int ix;
155  int iy;
156  int i2;
157  int k;
158  if( ( n < 1 ) || ( a == 0.0 ) )
159  {
160  }
161  else
162  {
163  ix = ix0 - 1;
164  iy = iy0 - 1;
165  i2 = n - 1;
166  for( k = 0; k <= i2; k++ )
167  {
168  y[iy] += a * y[ix];
169  ix++;
170  iy++;
171  }
172  }
173  }
174 
175  double xdotc( int n, const double x[9], int ix0, const double y[9], int iy0 )
176  {
177  double d;
178  int ix;
179  int iy;
180  int k;
181  d = 0.0;
182  if( n >= 1 )
183  {
184  ix = ix0;
185  iy = iy0;
186  for( k = 0; k < n; k++ )
187  {
188  d += x[ix - 1] * y[iy - 1];
189  ix++;
190  iy++;
191  }
192  }
193 
194  return d;
195  }
196 
197  void xrotg( double * a, double * b, double * c, double * s )
198  {
199  double roe;
200  double absa;
201  double absb;
202  double scale;
203  double ads;
204  double bds;
205  roe = *b;
206  absa = std::abs( *a );
207  absb = std::abs( *b );
208  if( absa > absb )
209  {
210  roe = *a;
211  }
212 
213  scale = absa + absb;
214  if( scale == 0.0 )
215  {
216  *s = 0.0;
217  *c = 1.0;
218  *a = 0.0;
219  *b = 0.0;
220  }
221  else
222  {
223  ads = absa / scale;
224  bds = absb / scale;
225  scale *= std::sqrt( ads * ads + bds * bds );
226  if( roe < 0.0 )
227  {
228  scale = -scale;
229  }
230 
231  *c = *a / scale;
232  *s = *b / scale;
233  if( absa > absb )
234  {
235  *b = *s;
236  }
237  else if( *c != 0.0 )
238  {
239  *b = 1.0 / *c;
240  }
241  else
242  {
243  *b = 1.0;
244  }
245 
246  *a = scale;
247  }
248  }
249 
250  void xrot( double x[9], int ix0, int iy0, double c, double s )
251  {
252  int ix;
253  int iy;
254  double temp;
255  ix = ix0 - 1;
256  iy = iy0 - 1;
257  temp = c * x[ix] + s * x[iy];
258  x[iy] = c * x[iy] - s * x[ix];
259  x[ix] = temp;
260  iy++;
261  ix++;
262  temp = c * x[ix] + s * x[iy];
263  x[iy] = c * x[iy] - s * x[ix];
264  x[ix] = temp;
265  iy++;
266  ix++;
267  temp = c * x[ix] + s * x[iy];
268  x[iy] = c * x[iy] - s * x[ix];
269  x[ix] = temp;
270  }
271 
272  void b_sqrt( double * x ) { *x = std::sqrt( *x ); }
273 
274  void xswap( double x[9], int ix0, int iy0 )
275  {
276  int ix;
277  int iy;
278  double temp;
279  ix = ix0 - 1;
280  iy = iy0 - 1;
281  temp = x[ix];
282  x[ix] = x[iy];
283  x[iy] = temp;
284  ix++;
285  iy++;
286  temp = x[ix];
287  x[ix] = x[iy];
288  x[iy] = temp;
289  ix++;
290  iy++;
291  temp = x[ix];
292  x[ix] = x[iy];
293  x[iy] = temp;
294  }
295 
296 
297 
298  void svd_3x3( const double A[9], double U[9], double s[3], double V[9] )
299  {
300  double b_A[9];
301  double e[3];
302  double work[3];
303  double Vf[9];
304  bool apply_transform;
305  double nrm;
306  double b_s[3];
307  int kase;
308  int qp1;
309  int qjj;
310  double r;
311  int m;
312  int q;
313  int qq;
314  double snorm;
315  int exitg1;
316  bool exitg2;
317  double scale;
318  double sm;
319  double sqds;
320  double b;
321  memcpy( &b_A[0], &A[0], 9U * sizeof( double ) );
322  e[0] = 0.0;
323  work[0] = 0.0;
324  e[1] = 0.0;
325  work[1] = 0.0;
326  e[2] = 0.0;
327  work[2] = 0.0;
328  memset( &U[0], 0, 9U * sizeof( double ) );
329  memset( &Vf[0], 0, 9U * sizeof( double ) );
330  apply_transform = false;
331  nrm = xnrm2( 3, b_A, 1 );
332  if( nrm > 0.0 )
333  {
334  apply_transform = true;
335  if( b_A[0] < 0.0 )
336  {
337  nrm = -nrm;
338  }
339 
340  if( std::abs( nrm ) >= 1.0020841800044864E-292 )
341  {
342  r = 1.0 / nrm;
343  for( qp1 = 1; qp1 < 4; qp1++ )
344  {
345  b_A[qp1 - 1] *= r;
346  }
347  }
348  else
349  {
350  for( qp1 = 1; qp1 < 4; qp1++ )
351  {
352  b_A[qp1 - 1] /= nrm;
353  }
354  }
355 
356  b_A[0]++;
357  b_s[0] = -nrm;
358  }
359  else
360  {
361  b_s[0] = 0.0;
362  }
363 
364  for( kase = 2; kase < 4; kase++ )
365  {
366  qjj = 3 * (kase - 1);
367  if( apply_transform )
368  {
369  xaxpy( 3, -(xdotc( 3, b_A, 1, b_A, qjj + 1 ) / b_A[0]), 1, b_A, qjj + 1 );
370  }
371 
372  e[kase - 1] = b_A[qjj];
373  }
374 
375  for( qp1 = 1; qp1 < 4; qp1++ )
376  {
377  U[qp1 - 1] = b_A[qp1 - 1];
378  }
379 
380  nrm = b_xnrm2( 2, e, 2 );
381  if( nrm == 0.0 )
382  {
383  e[0] = 0.0;
384  }
385  else
386  {
387  if( e[1] < 0.0 )
388  {
389  e[0] = -nrm;
390  }
391  else
392  {
393  e[0] = nrm;
394  }
395 
396  r = e[0];
397  if( std::abs( e[0] ) >= 1.0020841800044864E-292 )
398  {
399  r = 1.0 / e[0];
400  for( qp1 = 2; qp1 < 4; qp1++ )
401  {
402  e[qp1 - 1] *= r;
403  }
404  }
405  else
406  {
407  for( qp1 = 2; qp1 < 4; qp1++ )
408  {
409  e[qp1 - 1] /= r;
410  }
411  }
412 
413  e[1]++;
414  e[0] = -e[0];
415  for( qp1 = 2; qp1 < 4; qp1++ )
416  {
417  work[qp1 - 1] = 0.0;
418  }
419 
420  for( kase = 2; kase < 4; kase++ )
421  {
422  b_xaxpy( 2, e[kase - 1], b_A, 3 * (kase - 1) + 2, work, 2 );
423  }
424 
425  for( kase = 2; kase < 4; kase++ )
426  {
427  c_xaxpy( 2, -e[kase - 1] / e[1], work, 2, b_A, 3 * (kase - 1) + 2 );
428  }
429  }
430 
431  for( qp1 = 2; qp1 < 4; qp1++ )
432  {
433  Vf[qp1 - 1] = e[qp1 - 1];
434  }
435 
436  apply_transform = false;
437  nrm = xnrm2( 2, b_A, 5 );
438  if( nrm > 0.0 )
439  {
440  apply_transform = true;
441  if( b_A[4] < 0.0 )
442  {
443  nrm = -nrm;
444  }
445 
446  if( std::abs( nrm ) >= 1.0020841800044864E-292 )
447  {
448  r = 1.0 / nrm;
449  for( qp1 = 5; qp1 < 7; qp1++ )
450  {
451  b_A[qp1 - 1] *= r;
452  }
453  }
454  else
455  {
456  for( qp1 = 5; qp1 < 7; qp1++ )
457  {
458  b_A[qp1 - 1] /= nrm;
459  }
460  }
461 
462  b_A[4]++;
463  b_s[1] = -nrm;
464  }
465  else
466  {
467  b_s[1] = 0.0;
468  }
469 
470  for( kase = 3; kase < 4; kase++ )
471  {
472  if( apply_transform )
473  {
474  xaxpy( 2, -(xdotc( 2, b_A, 5, b_A, 8 ) / b_A[4]), 5, b_A, 8 );
475  }
476  }
477 
478  for( qp1 = 2; qp1 < 4; qp1++ )
479  {
480  U[qp1 + 2] = b_A[qp1 + 2];
481  }
482 
483  m = 1;
484  b_s[2] = b_A[8];
485  e[1] = b_A[7];
486  e[2] = 0.0;
487  U[6] = 0.0;
488  U[7] = 0.0;
489  U[8] = 1.0;
490  for( q = 1; q >= 0; q-- )
491  {
492  qp1 = q + 2;
493  qq = q + 3 * q;
494  if( b_s[q] != 0.0 )
495  {
496  for( kase = qp1; kase < 4; kase++ )
497  {
498  qjj = (q + 3 * (kase - 1)) + 1;
499  xaxpy( 3 - q, -(xdotc( 3 - q, U, qq + 1, U, qjj ) / U[qq]), qq + 1, U, qjj );
500  }
501 
502  for( qp1 = q + 1; qp1 < 4; qp1++ )
503  {
504  kase = (qp1 + 3 * q) - 1;
505  U[kase] = -U[kase];
506  }
507 
508  U[qq]++;
509  if( 0 <= q - 1 )
510  {
511  U[3 * q] = 0.0;
512  }
513  }
514  else
515  {
516  U[3 * q] = 0.0;
517  U[1 + 3 * q] = 0.0;
518  U[2 + 3 * q] = 0.0;
519  U[qq] = 1.0;
520  }
521  }
522 
523  for( q = 2; q >= 0; q-- )
524  {
525  if( (q + 1 <= 1) && (e[0] != 0.0) )
526  {
527  xaxpy( 2, -(xdotc( 2, Vf, 2, Vf, 5 ) / Vf[1]), 2, Vf, 5 );
528  xaxpy( 2, -(xdotc( 2, Vf, 2, Vf, 8 ) / Vf[1]), 2, Vf, 8 );
529  }
530 
531  Vf[3 * q] = 0.0;
532  Vf[1 + 3 * q] = 0.0;
533  Vf[2 + 3 * q] = 0.0;
534  Vf[q + 3 * q] = 1.0;
535  }
536 
537  qq = 0;
538  snorm = 0.0;
539  for( q = 0; q < 3; q++ )
540  {
541  if( b_s[q] != 0.0 )
542  {
543  nrm = std::abs( b_s[q] );
544  r = b_s[q] / nrm;
545  b_s[q] = nrm;
546  if( q + 1 < 3 )
547  {
548  e[q] /= r;
549  }
550 
551  kase = 3 * q;
552  qjj = kase + 3;
553  for( qp1 = kase + 1; qp1 <= qjj; qp1++ )
554  {
555  U[qp1 - 1] *= r;
556  }
557  }
558 
559  if( (q + 1 < 3) && (e[q] != 0.0) )
560  {
561  nrm = std::abs( e[q] );
562  r = nrm / e[q];
563  e[q] = nrm;
564  b_s[q + 1] *= r;
565  kase = 3 * (q + 1);
566  qjj = kase + 3;
567  for( qp1 = kase + 1; qp1 <= qjj; qp1++ )
568  {
569  Vf[qp1 - 1] *= r;
570  }
571  }
572 
573  nrm = std::abs( b_s[q] );
574  r = std::abs( e[q] );
575  if( (nrm > r) || rtIsNaN( r ) )
576  {
577  r = nrm;
578  }
579 
580  if( (!(snorm > r)) && (!rtIsNaN( r )) )
581  {
582  snorm = r;
583  }
584  }
585 
586  while( (m + 2 > 0) && (qq < 75) )
587  {
588  qp1 = m;
589  do
590  {
591  exitg1 = 0;
592  q = qp1 + 1;
593  if( qp1 + 1 == 0 )
594  {
595  exitg1 = 1;
596  }
597  else
598  {
599  nrm = std::abs( e[qp1] );
600  if( (nrm <= 2.2204460492503131E-16
601  * (std::abs( b_s[qp1] ) + std::abs( b_s[qp1 + 1] )))
602  || (nrm <= 1.0020841800044864E-292)
603  || ((qq > 20) && (nrm <= 2.2204460492503131E-16 * snorm)) )
604  {
605  e[qp1] = 0.0;
606  exitg1 = 1;
607  }
608  else
609  {
610  qp1--;
611  }
612  }
613  } while( exitg1 == 0 );
614 
615  if( qp1 + 1 == m + 1 )
616  {
617  kase = 4;
618  }
619  else
620  {
621  qjj = m + 2;
622  kase = m + 2;
623  exitg2 = false;
624  while( (!exitg2) && (kase >= qp1 + 1) )
625  {
626  qjj = kase;
627  if( kase == qp1 + 1 )
628  {
629  exitg2 = true;
630  }
631  else
632  {
633  nrm = 0.0;
634  if( kase < m + 2 )
635  {
636  nrm = std::abs( e[kase - 1] );
637  }
638 
639  if( kase > qp1 + 2 )
640  {
641  nrm += std::abs( e[kase - 2] );
642  }
643 
644  r = std::abs( b_s[kase - 1] );
645  if( (r <= 2.2204460492503131E-16 * nrm) || (r <= 1.0020841800044864E-292) )
646  {
647  b_s[kase - 1] = 0.0;
648  exitg2 = true;
649  }
650  else
651  {
652  kase--;
653  }
654  }
655  }
656 
657  if( qjj == qp1 + 1 )
658  {
659  kase = 3;
660  }
661  else if( qjj == m + 2 )
662  {
663  kase = 1;
664  }
665  else
666  {
667  kase = 2;
668  q = qjj;
669  }
670  }
671 
672  switch( kase )
673  {
674  case 1:
675  r = e[m];
676  e[m] = 0.0;
677  qjj = m + 1;
678  for( qp1 = qjj; qp1 >= q + 1; qp1-- )
679  {
680  xrotg( &b_s[qp1 - 1], &r, &sm, &sqds );
681  if( qp1 > q + 1 )
682  {
683  r = -sqds * e[0];
684  e[0] *= sm;
685  }
686 
687  xrot( Vf, 1 + 3 * (qp1 - 1), 1 + 3 * (m + 1), sm, sqds );
688  }
689  break;
690 
691  case 2:
692  r = e[q - 1];
693  e[q - 1] = 0.0;
694  for( qp1 = q + 1; qp1 <= m + 2; qp1++ )
695  {
696  xrotg( &b_s[qp1 - 1], &r, &sm, &sqds );
697  b = e[qp1 - 1];
698  r = -sqds * b;
699  e[qp1 - 1] = b * sm;
700  xrot( U, 1 + 3 * (qp1 - 1), 1 + 3 * (q - 1), sm, sqds );
701  }
702  break;
703 
704  case 3:
705  kase = m + 1;
706  scale = std::abs( b_s[m + 1] );
707  r = std::abs( b_s[m] );
708  if( (!(scale > r)) && (!rtIsNaN( r )) )
709  {
710  scale = r;
711  }
712 
713  r = std::abs( e[m] );
714  if( (!(scale > r)) && (!rtIsNaN( r )) )
715  {
716  scale = r;
717  }
718 
719  r = std::abs( b_s[q] );
720  if( (!(scale > r)) && (!rtIsNaN( r )) )
721  {
722  scale = r;
723  }
724 
725  r = std::abs( e[q] );
726  if( (!(scale > r)) && (!rtIsNaN( r )) )
727  {
728  scale = r;
729  }
730 
731  sm = b_s[m + 1] / scale;
732  nrm = b_s[m] / scale;
733  r = e[m] / scale;
734  sqds = b_s[q] / scale;
735  b = ((nrm + sm) * (nrm - sm) + r * r) / 2.0;
736  nrm = sm * r;
737  nrm *= nrm;
738  if( (b != 0.0) || (nrm != 0.0) )
739  {
740  r = b * b + nrm;
741  b_sqrt( &r );
742  if( b < 0.0 )
743  {
744  r = -r;
745  }
746 
747  r = nrm / (b + r);
748  }
749  else
750  {
751  r = 0.0;
752  }
753 
754  r += (sqds + sm) * (sqds - sm);
755  nrm = sqds * (e[q] / scale);
756  for( qp1 = q + 1; qp1 <= kase; qp1++ )
757  {
758  xrotg( &r, &nrm, &sm, &sqds );
759  if( qp1 > q + 1 )
760  {
761  e[0] = r;
762  }
763 
764  b = e[qp1 - 1];
765  nrm = b_s[qp1 - 1];
766  e[qp1 - 1] = sm * b - sqds * nrm;
767  r = sqds * b_s[qp1];
768  b_s[qp1] *= sm;
769  xrot( Vf, 1 + 3 * (qp1 - 1), 1 + 3 * qp1, sm, sqds );
770  b_s[qp1 - 1] = sm * nrm + sqds * b;
771  xrotg( &b_s[qp1 - 1], &r, &sm, &sqds );
772  b = e[qp1 - 1];
773  r = sm * b + sqds * b_s[qp1];
774  b_s[qp1] = -sqds * b + sm * b_s[qp1];
775  nrm = sqds * e[qp1];
776  e[qp1] *= sm;
777  xrot( U, 1 + 3 * (qp1 - 1), 1 + 3 * qp1, sm, sqds );
778  }
779 
780  e[m] = r;
781  qq++;
782  break;
783 
784  default:
785  if( b_s[q] < 0.0 )
786  {
787  b_s[q] = -b_s[q];
788  kase = 3 * q;
789  qjj = kase + 3;
790  for( qp1 = kase + 1; qp1 <= qjj; qp1++ )
791  {
792  Vf[qp1 - 1] = -Vf[qp1 - 1];
793  }
794  }
795 
796  qp1 = q + 1;
797  while( (q + 1 < 3) && (b_s[q] < b_s[qp1]) )
798  {
799  nrm = b_s[q];
800  b_s[q] = b_s[qp1];
801  b_s[qp1] = nrm;
802  xswap( Vf, 1 + 3 * q, 1 + 3 * (q + 1) );
803  xswap( U, 1 + 3 * q, 1 + 3 * (q + 1) );
804  q = qp1;
805  qp1++;
806  }
807 
808  qq = 0;
809  m--;
810  break;
811  }
812  }
813 
814  for( qp1 = 0; qp1 < 3; qp1++ )
815  {
816  s[qp1] = b_s[qp1];
817  V[3 * qp1] = Vf[3 * qp1];
818  kase = 1 + 3 * qp1;
819  V[kase] = Vf[kase];
820  kase = 2 + 3 * qp1;
821  V[kase] = Vf[kase];
822  }
823  }
824 
825 } // anon namespace
826 
827 
828 void librealsense::algo::depth_to_rgb_calibration::pinv_3x3( const double m[9], double n[9] )
829 {
830  int br;
831  double U[9];
832  double s[3];
833  double V[9];
834  int i0;
835  double absxk;
836  int vcol;
837  int r;
838  int j;
839  int ar;
840  int ib;
841  int ia;
842  int i1;
843  int ic;
844  bool p = true;
845  for( br = 0; br < 9; br++ )
846  {
847  n[br] = 0.0;
848  if( p && ((!rtIsInf( m[br] )) && (!rtIsNaN( m[br] ))) )
849  p = true;
850  else
851  p = false;
852  }
853 
854  if( !p )
855  {
856  for( i0 = 0; i0 < 9; i0++ )
857  n[i0] = std::numeric_limits< double >::quiet_NaN();
858  }
859  else
860  {
861  svd_3x3( m, U, s, V );
862  absxk = std::abs( s[0] );
863  if( (!rtIsInf( absxk )) && (!rtIsNaN( absxk )) )
864  {
865  if( absxk <= 2.2250738585072014E-308 )
866  {
867  absxk = 4.94065645841247E-324;
868  }
869  else
870  {
871  frexp( absxk, &vcol );
872  absxk = std::ldexp( 1.0, vcol - 53 );
873  }
874  }
875  else
876  {
877  absxk = std::numeric_limits< double >::quiet_NaN();
878  }
879 
880  absxk *= 3.0;
881  r = -1;
882  br = 0;
883  while( (br < 3) && (s[br] > absxk) )
884  {
885  r++;
886  br++;
887  }
888 
889  if( r + 1 > 0 )
890  {
891  vcol = 1;
892  for( j = 0; j <= r; j++ )
893  {
894  absxk = 1.0 / s[j];
895  i0 = vcol + 2;
896  for( br = vcol; br <= i0; br++ )
897  {
898  V[br - 1] *= absxk;
899  }
900 
901  vcol += 3;
902  }
903 
904  for( vcol = 0; vcol <= 6; vcol += 3 )
905  {
906  i0 = vcol + 1;
907  j = vcol + 3;
908  if( i0 <= j )
909  {
910  memset( &n[i0 + -1],
911  0,
912  (unsigned int)(((j - i0) + 1)
913  * static_cast<int>(sizeof( double ))) );
914  }
915  }
916 
917  br = 0;
918  for( vcol = 0; vcol <= 6; vcol += 3 )
919  {
920  ar = -1;
921  br++;
922  i0 = br + 3 * r;
923  for( ib = br; ib <= i0; ib += 3 )
924  {
925  ia = ar;
926  j = vcol + 1;
927  i1 = vcol + 3;
928  for( ic = j; ic <= i1; ic++ )
929  {
930  ia++;
931  n[ic - 1] += U[ib - 1] * V[ia];
932  }
933 
934  ar += 3;
935  }
936  }
937  }
938  }
939 }
GLboolean GLboolean GLboolean b
GLint y
GLint i1
GLdouble s
GLfloat GLfloat p
Definition: glext.h:12687
const GLfloat * m
Definition: glext.h:6814
GLenum GLenum GLenum GLenum GLenum scale
Definition: glext.h:10806
GLfloat value
static bool rtIsNaN(double value)
d
Definition: rmse.py:171
GLdouble n
Definition: glext.h:1966
e
Definition: rmse.py:177
static bool rtIsInf(double value)
GLdouble t
GLboolean GLboolean GLboolean GLboolean a
const GLubyte * c
Definition: glext.h:12690
GLdouble GLdouble r
GLdouble x
GLint j
GLdouble GLdouble GLdouble q
void pinv_3x3(const double in[9], double out[9])
Definition: pinv_3x3.cpp:828
GLint GLint i2


librealsense2
Author(s): Sergey Dorodnicov , Doron Hirshberg , Mark Horn , Reagan Lopez , Itay Carpis
autogenerated on Mon May 3 2021 02:47:39