18e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener/*****************************************************************************/ 28e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener// Copyright 2006-2008 Adobe Systems Incorporated 38e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener// All Rights Reserved. 48e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener// 58e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener// NOTICE: Adobe permits you to use, modify, and distribute this file in 68e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener// accordance with the terms of the Adobe license agreement accompanying it. 78e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener/*****************************************************************************/ 88e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 98e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener/* $Id: //mondo/dng_sdk_1_4/dng_sdk/source/dng_matrix.cpp#1 $ */ 108e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener/* $DateTime: 2012/05/30 13:28:51 $ */ 118e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener/* $Change: 832332 $ */ 128e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener/* $Author: tknoll $ */ 138e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 148e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener/*****************************************************************************/ 158e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 168e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener#include "dng_matrix.h" 178e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 188e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener#include "dng_exceptions.h" 198e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener#include "dng_utils.h" 208e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 218e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener/*****************************************************************************/ 228e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 238e8939fc10ad63576a2785ba1333a23726b7e164Florian Krienerdng_matrix::dng_matrix () 248e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 258e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener : fRows (0) 268e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener , fCols (0) 278e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 288e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener { 298e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 308e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener } 318e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 328e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener/*****************************************************************************/ 338e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 348e8939fc10ad63576a2785ba1333a23726b7e164Florian Krienerdng_matrix::dng_matrix (uint32 rows, 358e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener uint32 cols) 368e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 378e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener : fRows (0) 388e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener , fCols (0) 398e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 408e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener { 418e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 428e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener if (rows < 1 || rows > kMaxColorPlanes || 438e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener cols < 1 || cols > kMaxColorPlanes) 448e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener { 458e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 468e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener ThrowProgramError (); 478e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 488e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener } 498e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 508e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener fRows = rows; 518e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener fCols = cols; 528e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 538e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener for (uint32 row = 0; row < fRows; row++) 548e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener for (uint32 col = 0; col < fCols; col++) 558e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener { 568e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 578e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener fData [row] [col] = 0.0; 588e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 598e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener } 608e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 618e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener } 628e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 638e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener/*****************************************************************************/ 648e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 658e8939fc10ad63576a2785ba1333a23726b7e164Florian Krienerdng_matrix::dng_matrix (const dng_matrix &m) 668e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 678e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener : fRows (m.fRows) 688e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener , fCols (m.fCols) 698e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 708e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener { 718e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 728e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener for (uint32 row = 0; row < fRows; row++) 738e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener for (uint32 col = 0; col < fCols; col++) 748e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener { 758e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 768e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener fData [row] [col] = m.fData [row] [col]; 778e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 788e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener } 798e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 808e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener } 818e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 828e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener/*****************************************************************************/ 838e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 848e8939fc10ad63576a2785ba1333a23726b7e164Florian Krienervoid dng_matrix::Clear () 858e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener { 868e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 878e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener fRows = 0; 888e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener fCols = 0; 898e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 908e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener } 918e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 928e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener/*****************************************************************************/ 938e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 948e8939fc10ad63576a2785ba1333a23726b7e164Florian Krienervoid dng_matrix::SetIdentity (uint32 count) 958e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener { 968e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 978e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener *this = dng_matrix (count, count); 988e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 998e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener for (uint32 j = 0; j < count; j++) 1008e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener { 1018e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 1028e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener fData [j] [j] = 1.0; 1038e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 1048e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener } 1058e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 1068e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener } 1078e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 1088e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener/******************************************************************************/ 1098e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 1108e8939fc10ad63576a2785ba1333a23726b7e164Florian Krienerbool dng_matrix::operator== (const dng_matrix &m) const 1118e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener { 1128e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 1138e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener if (Rows () != m.Rows () || 1148e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener Cols () != m.Cols ()) 1158e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener { 1168e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 1178e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener return false; 1188e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 1198e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener } 1208e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 1218e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener for (uint32 j = 0; j < Rows (); j++) 1228e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener for (uint32 k = 0; k < Cols (); k++) 1238e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener { 1248e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 1258e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener if (fData [j] [k] != m.fData [j] [k]) 1268e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener { 1278e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 1288e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener return false; 1298e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 1308e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener } 1318e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 1328e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener } 1338e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 1348e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener return true; 1358e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 1368e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener } 1378e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 1388e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener/******************************************************************************/ 1398e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 1408e8939fc10ad63576a2785ba1333a23726b7e164Florian Krienerbool dng_matrix::IsDiagonal () const 1418e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener { 1428e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 1438e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener if (IsEmpty ()) 1448e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener { 1458e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener return false; 1468e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener } 1478e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 1488e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener if (Rows () != Cols ()) 1498e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener { 1508e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener return false; 1518e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener } 1528e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 1538e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener for (uint32 j = 0; j < Rows (); j++) 1548e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener for (uint32 k = 0; k < Cols (); k++) 1558e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener { 1568e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 1578e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener if (j != k) 1588e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener { 1598e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 1608e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener if (fData [j] [k] != 0.0) 1618e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener { 1628e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener return false; 1638e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener } 1648e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 1658e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener } 1668e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 1678e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener } 1688e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 1698e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener return true; 1708e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 1718e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener } 1728e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 1738e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener/******************************************************************************/ 1748e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 1758e8939fc10ad63576a2785ba1333a23726b7e164Florian Krienerreal64 dng_matrix::MaxEntry () const 1768e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener { 1778e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 1788e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener if (IsEmpty ()) 1798e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener { 1808e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 1818e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener return 0.0; 1828e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 1838e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener } 1848e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 1858e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener real64 m = fData [0] [0]; 1868e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 1878e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener for (uint32 j = 0; j < Rows (); j++) 1888e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener for (uint32 k = 0; k < Cols (); k++) 1898e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener { 1908e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 1918e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener m = Max_real64 (m, fData [j] [k]); 1928e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 1938e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener } 1948e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 1958e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener return m; 1968e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 1978e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener } 1988e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 1998e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener/******************************************************************************/ 2008e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 2018e8939fc10ad63576a2785ba1333a23726b7e164Florian Krienerreal64 dng_matrix::MinEntry () const 2028e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener { 2038e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 2048e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener if (IsEmpty ()) 2058e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener { 2068e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 2078e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener return 0.0; 2088e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 2098e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener } 2108e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 2118e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener real64 m = fData [0] [0]; 2128e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 2138e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener for (uint32 j = 0; j < Rows (); j++) 2148e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener for (uint32 k = 0; k < Cols (); k++) 2158e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener { 2168e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 2178e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener m = Min_real64 (m, fData [j] [k]); 2188e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 2198e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener } 2208e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 2218e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener return m; 2228e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 2238e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener } 2248e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 2258e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener/*****************************************************************************/ 2268e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 2278e8939fc10ad63576a2785ba1333a23726b7e164Florian Krienervoid dng_matrix::Scale (real64 factor) 2288e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener { 2298e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 2308e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener for (uint32 j = 0; j < Rows (); j++) 2318e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener for (uint32 k = 0; k < Cols (); k++) 2328e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener { 2338e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 2348e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener fData [j] [k] *= factor; 2358e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 2368e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener } 2378e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 2388e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener } 2398e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 2408e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener/*****************************************************************************/ 2418e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 2428e8939fc10ad63576a2785ba1333a23726b7e164Florian Krienervoid dng_matrix::Round (real64 factor) 2438e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener { 2448e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 2458e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener real64 invFactor = 1.0 / factor; 2468e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 2478e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener for (uint32 j = 0; j < Rows (); j++) 2488e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener for (uint32 k = 0; k < Cols (); k++) 2498e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener { 2508e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 2518e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener fData [j] [k] = Round_int32 (fData [j] [k] * factor) * invFactor; 2528e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 2538e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener } 2548e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 2558e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener } 2568e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 2578e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener/*****************************************************************************/ 2588e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 2598e8939fc10ad63576a2785ba1333a23726b7e164Florian Krienervoid dng_matrix::SafeRound (real64 factor) 2608e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener { 2618e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 2628e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener real64 invFactor = 1.0 / factor; 2638e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 2648e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener for (uint32 j = 0; j < Rows (); j++) 2658e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener { 2668e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 2678e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener // Round each row to the specified accuracy, but make sure the 2688e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener // a rounding does not affect the total of the elements in a row 2698e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener // more than necessary. 2708e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 2718e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener real64 error = 0.0; 2728e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 2738e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener for (uint32 k = 0; k < Cols (); k++) 2748e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener { 2758e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 2768e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener fData [j] [k] += error; 2778e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 2788e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener real64 rounded = Round_int32 (fData [j] [k] * factor) * invFactor; 2798e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 2808e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener error = fData [j] [k] - rounded; 2818e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 2828e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener fData [j] [k] = rounded; 2838e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 2848e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener } 2858e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 2868e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener } 2878e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 2888e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener } 2898e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 2908e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener/*****************************************************************************/ 2918e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 2928e8939fc10ad63576a2785ba1333a23726b7e164Florian Krienerdng_matrix_3by3::dng_matrix_3by3 () 2938e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 2948e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener : dng_matrix (3, 3) 2958e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 2968e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener { 2978e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener } 2988e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 2998e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener/*****************************************************************************/ 3008e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 3018e8939fc10ad63576a2785ba1333a23726b7e164Florian Krienerdng_matrix_3by3::dng_matrix_3by3 (const dng_matrix &m) 3028e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 3038e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener : dng_matrix (m) 3048e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 3058e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener { 3068e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 3078e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener if (Rows () != 3 || 3088e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener Cols () != 3) 3098e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener { 3108e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 3118e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener ThrowMatrixMath (); 3128e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 3138e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener } 3148e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 3158e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener } 3168e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 3178e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener/*****************************************************************************/ 3188e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 3198e8939fc10ad63576a2785ba1333a23726b7e164Florian Krienerdng_matrix_3by3::dng_matrix_3by3 (real64 a00, real64 a01, real64 a02, 3208e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener real64 a10, real64 a11, real64 a12, 3218e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener real64 a20, real64 a21, real64 a22) 3228e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 3238e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 3248e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener : dng_matrix (3, 3) 3258e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 3268e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener { 3278e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 3288e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener fData [0] [0] = a00; 3298e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener fData [0] [1] = a01; 3308e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener fData [0] [2] = a02; 3318e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 3328e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener fData [1] [0] = a10; 3338e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener fData [1] [1] = a11; 3348e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener fData [1] [2] = a12; 3358e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 3368e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener fData [2] [0] = a20; 3378e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener fData [2] [1] = a21; 3388e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener fData [2] [2] = a22; 3398e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 3408e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener } 3418e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 3428e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener/*****************************************************************************/ 3438e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 3448e8939fc10ad63576a2785ba1333a23726b7e164Florian Krienerdng_matrix_3by3::dng_matrix_3by3 (real64 a00, real64 a11, real64 a22) 3458e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 3468e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener : dng_matrix (3, 3) 3478e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 3488e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener { 3498e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 3508e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener fData [0] [0] = a00; 3518e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener fData [1] [1] = a11; 3528e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener fData [2] [2] = a22; 3538e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 3548e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener } 3558e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 3568e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener/*****************************************************************************/ 3578e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 3588e8939fc10ad63576a2785ba1333a23726b7e164Florian Krienerdng_matrix_4by3::dng_matrix_4by3 () 3598e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 3608e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener : dng_matrix (4, 3) 3618e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 3628e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener { 3638e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener } 3648e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 3658e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener/*****************************************************************************/ 3668e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 3678e8939fc10ad63576a2785ba1333a23726b7e164Florian Krienerdng_matrix_4by3::dng_matrix_4by3 (const dng_matrix &m) 3688e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 3698e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener : dng_matrix (m) 3708e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 3718e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener { 3728e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 3738e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener if (Rows () != 4 || 3748e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener Cols () != 3) 3758e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener { 3768e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 3778e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener ThrowMatrixMath (); 3788e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 3798e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener } 3808e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 3818e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener } 3828e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 3838e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener/*****************************************************************************/ 3848e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 3858e8939fc10ad63576a2785ba1333a23726b7e164Florian Krienerdng_matrix_4by3::dng_matrix_4by3 (real64 a00, real64 a01, real64 a02, 3868e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener real64 a10, real64 a11, real64 a12, 3878e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener real64 a20, real64 a21, real64 a22, 3888e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener real64 a30, real64 a31, real64 a32) 3898e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 3908e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 3918e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener : dng_matrix (4, 3) 3928e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 3938e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener { 3948e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 3958e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener fData [0] [0] = a00; 3968e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener fData [0] [1] = a01; 3978e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener fData [0] [2] = a02; 3988e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 3998e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener fData [1] [0] = a10; 4008e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener fData [1] [1] = a11; 4018e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener fData [1] [2] = a12; 4028e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 4038e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener fData [2] [0] = a20; 4048e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener fData [2] [1] = a21; 4058e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener fData [2] [2] = a22; 4068e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 4078e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener fData [3] [0] = a30; 4088e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener fData [3] [1] = a31; 4098e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener fData [3] [2] = a32; 4108e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 4118e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener } 4128e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 4138e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener/*****************************************************************************/ 4148e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 4158e8939fc10ad63576a2785ba1333a23726b7e164Florian Krienerdng_vector::dng_vector () 4168e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 4178e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener : fCount (0) 4188e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 4198e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener { 4208e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 4218e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener } 4228e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 4238e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener/*****************************************************************************/ 4248e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 4258e8939fc10ad63576a2785ba1333a23726b7e164Florian Krienerdng_vector::dng_vector (uint32 count) 4268e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 4278e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener : fCount (0) 4288e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 4298e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener { 4308e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 4318e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener if (count < 1 || count > kMaxColorPlanes) 4328e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener { 4338e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 4348e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener ThrowProgramError (); 4358e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 4368e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener } 4378e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 4388e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener fCount = count; 4398e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 4408e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener for (uint32 index = 0; index < fCount; index++) 4418e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener { 4428e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 4438e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener fData [index] = 0.0; 4448e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 4458e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener } 4468e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 4478e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener } 4488e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 4498e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener/*****************************************************************************/ 4508e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 4518e8939fc10ad63576a2785ba1333a23726b7e164Florian Krienerdng_vector::dng_vector (const dng_vector &v) 4528e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 4538e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener : fCount (v.fCount) 4548e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 4558e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener { 4568e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 4578e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener for (uint32 index = 0; index < fCount; index++) 4588e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener { 4598e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 4608e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener fData [index] = v.fData [index]; 4618e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 4628e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener } 4638e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 4648e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener } 4658e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 4668e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener/*****************************************************************************/ 4678e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 4688e8939fc10ad63576a2785ba1333a23726b7e164Florian Krienervoid dng_vector::Clear () 4698e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener { 4708e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 4718e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener fCount = 0; 4728e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 4738e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener } 4748e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 4758e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener/*****************************************************************************/ 4768e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 4778e8939fc10ad63576a2785ba1333a23726b7e164Florian Krienervoid dng_vector::SetIdentity (uint32 count) 4788e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener { 4798e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 4808e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener *this = dng_vector (count); 4818e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 4828e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener for (uint32 j = 0; j < count; j++) 4838e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener { 4848e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 4858e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener fData [j] = 1.0; 4868e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 4878e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener } 4888e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 4898e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener } 4908e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 4918e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener/******************************************************************************/ 4928e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 4938e8939fc10ad63576a2785ba1333a23726b7e164Florian Krienerbool dng_vector::operator== (const dng_vector &v) const 4948e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener { 4958e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 4968e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener if (Count () != v.Count ()) 4978e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener { 4988e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 4998e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener return false; 5008e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 5018e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener } 5028e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 5038e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener for (uint32 j = 0; j < Count (); j++) 5048e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener { 5058e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 5068e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener if (fData [j] != v.fData [j]) 5078e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener { 5088e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 5098e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener return false; 5108e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 5118e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener } 5128e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 5138e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener } 5148e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 5158e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener return true; 5168e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 5178e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener } 5188e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 5198e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener/******************************************************************************/ 5208e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 5218e8939fc10ad63576a2785ba1333a23726b7e164Florian Krienerreal64 dng_vector::MaxEntry () const 5228e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener { 5238e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 5248e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener if (IsEmpty ()) 5258e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener { 5268e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 5278e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener return 0.0; 5288e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 5298e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener } 5308e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 5318e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener real64 m = fData [0]; 5328e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 5338e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener for (uint32 j = 0; j < Count (); j++) 5348e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener { 5358e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 5368e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener m = Max_real64 (m, fData [j]); 5378e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 5388e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener } 5398e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 5408e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener return m; 5418e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 5428e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener } 5438e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 5448e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener/******************************************************************************/ 5458e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 5468e8939fc10ad63576a2785ba1333a23726b7e164Florian Krienerreal64 dng_vector::MinEntry () const 5478e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener { 5488e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 5498e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener if (IsEmpty ()) 5508e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener { 5518e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 5528e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener return 0.0; 5538e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 5548e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener } 5558e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 5568e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener real64 m = fData [0]; 5578e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 5588e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener for (uint32 j = 0; j < Count (); j++) 5598e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener { 5608e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 5618e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener m = Min_real64 (m, fData [j]); 5628e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 5638e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener } 5648e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 5658e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener return m; 5668e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 5678e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener } 5688e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 5698e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener/*****************************************************************************/ 5708e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 5718e8939fc10ad63576a2785ba1333a23726b7e164Florian Krienervoid dng_vector::Scale (real64 factor) 5728e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener { 5738e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 5748e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener for (uint32 j = 0; j < Count (); j++) 5758e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener { 5768e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 5778e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener fData [j] *= factor; 5788e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 5798e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener } 5808e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 5818e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener } 5828e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 5838e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener/*****************************************************************************/ 5848e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 5858e8939fc10ad63576a2785ba1333a23726b7e164Florian Krienervoid dng_vector::Round (real64 factor) 5868e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener { 5878e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 5888e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener real64 invFactor = 1.0 / factor; 5898e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 5908e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener for (uint32 j = 0; j < Count (); j++) 5918e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener { 5928e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 5938e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener fData [j] = Round_int32 (fData [j] * factor) * invFactor; 5948e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 5958e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener } 5968e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 5978e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener } 5988e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 5998e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener/*****************************************************************************/ 6008e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 6018e8939fc10ad63576a2785ba1333a23726b7e164Florian Krienerdng_matrix dng_vector::AsDiagonal () const 6028e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener { 6038e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 6048e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener dng_matrix M (Count (), Count ()); 6058e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 6068e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener for (uint32 j = 0; j < Count (); j++) 6078e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener { 6088e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 6098e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener M [j] [j] = fData [j]; 6108e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 6118e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener } 6128e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 6138e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener return M; 6148e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 6158e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener } 6168e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 6178e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener/*****************************************************************************/ 6188e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 6198e8939fc10ad63576a2785ba1333a23726b7e164Florian Krienerdng_matrix dng_vector::AsColumn () const 6208e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener { 6218e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 6228e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener dng_matrix M (Count (), 1); 6238e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 6248e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener for (uint32 j = 0; j < Count (); j++) 6258e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener { 6268e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 6278e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener M [j] [0] = fData [j]; 6288e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 6298e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener } 6308e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 6318e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener return M; 6328e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 6338e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener } 6348e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 6358e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener/******************************************************************************/ 6368e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 6378e8939fc10ad63576a2785ba1333a23726b7e164Florian Krienerdng_vector_3::dng_vector_3 () 6388e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 6398e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener : dng_vector (3) 6408e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 6418e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener { 6428e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener } 6438e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 6448e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener/******************************************************************************/ 6458e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 6468e8939fc10ad63576a2785ba1333a23726b7e164Florian Krienerdng_vector_3::dng_vector_3 (const dng_vector &v) 6478e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 6488e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener : dng_vector (v) 6498e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 6508e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener { 6518e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 6528e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener if (Count () != 3) 6538e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener { 6548e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 6558e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener ThrowMatrixMath (); 6568e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 6578e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener } 6588e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 6598e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener } 6608e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 6618e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener/******************************************************************************/ 6628e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 6638e8939fc10ad63576a2785ba1333a23726b7e164Florian Krienerdng_vector_3::dng_vector_3 (real64 a0, 6648e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener real64 a1, 6658e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener real64 a2) 6668e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 6678e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener : dng_vector (3) 6688e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 6698e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener { 6708e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 6718e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener fData [0] = a0; 6728e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener fData [1] = a1; 6738e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener fData [2] = a2; 6748e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 6758e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener } 6768e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 6778e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener/******************************************************************************/ 6788e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 6798e8939fc10ad63576a2785ba1333a23726b7e164Florian Krienerdng_vector_4::dng_vector_4 () 6808e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 6818e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener : dng_vector (4) 6828e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 6838e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener { 6848e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener } 6858e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 6868e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener/******************************************************************************/ 6878e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 6888e8939fc10ad63576a2785ba1333a23726b7e164Florian Krienerdng_vector_4::dng_vector_4 (const dng_vector &v) 6898e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 6908e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener : dng_vector (v) 6918e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 6928e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener { 6938e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 6948e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener if (Count () != 4) 6958e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener { 6968e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 6978e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener ThrowMatrixMath (); 6988e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 6998e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener } 7008e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 7018e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener } 7028e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 7038e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener/******************************************************************************/ 7048e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 7058e8939fc10ad63576a2785ba1333a23726b7e164Florian Krienerdng_vector_4::dng_vector_4 (real64 a0, 7068e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener real64 a1, 7078e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener real64 a2, 7088e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener real64 a3) 7098e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 7108e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener : dng_vector (4) 7118e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 7128e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener { 7138e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 7148e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener fData [0] = a0; 7158e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener fData [1] = a1; 7168e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener fData [2] = a2; 7178e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener fData [3] = a3; 7188e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 7198e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener } 7208e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 7218e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener/******************************************************************************/ 7228e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 7238e8939fc10ad63576a2785ba1333a23726b7e164Florian Krienerdng_matrix operator* (const dng_matrix &A, 7248e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener const dng_matrix &B) 7258e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener { 7268e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 7278e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener if (A.Cols () != B.Rows ()) 7288e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener { 7298e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 7308e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener ThrowMatrixMath (); 7318e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 7328e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener } 7338e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 7348e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener dng_matrix C (A.Rows (), B.Cols ()); 7358e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 7368e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener for (uint32 j = 0; j < C.Rows (); j++) 7378e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener for (uint32 k = 0; k < C.Cols (); k++) 7388e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener { 7398e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 7408e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener C [j] [k] = 0.0; 7418e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 7428e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener for (uint32 m = 0; m < A.Cols (); m++) 7438e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener { 7448e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 7458e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener real64 aa = A [j] [m]; 7468e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 7478e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener real64 bb = B [m] [k]; 7488e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 7498e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener C [j] [k] += aa * bb; 7508e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 7518e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener } 7528e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 7538e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener } 7548e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 7558e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener return C; 7568e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 7578e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener } 7588e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 7598e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener/******************************************************************************/ 7608e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 7618e8939fc10ad63576a2785ba1333a23726b7e164Florian Krienerdng_vector operator* (const dng_matrix &A, 7628e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener const dng_vector &B) 7638e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener { 7648e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 7658e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener if (A.Cols () != B.Count ()) 7668e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener { 7678e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 7688e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener ThrowMatrixMath (); 7698e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 7708e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener } 7718e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 7728e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener dng_vector C (A.Rows ()); 7738e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 7748e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener for (uint32 j = 0; j < C.Count (); j++) 7758e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener { 7768e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 7778e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener C [j] = 0.0; 7788e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 7798e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener for (uint32 m = 0; m < A.Cols (); m++) 7808e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener { 7818e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 7828e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener real64 aa = A [j] [m]; 7838e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 7848e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener real64 bb = B [m]; 7858e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 7868e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener C [j] += aa * bb; 7878e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 7888e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener } 7898e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 7908e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener } 7918e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 7928e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener return C; 7938e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 7948e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener } 7958e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 7968e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener/******************************************************************************/ 7978e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 7988e8939fc10ad63576a2785ba1333a23726b7e164Florian Krienerdng_matrix operator* (real64 scale, 7998e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener const dng_matrix &A) 8008e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener { 8018e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 8028e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener dng_matrix B (A); 8038e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 8048e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener B.Scale (scale); 8058e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 8068e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener return B; 8078e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 8088e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener } 8098e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 8108e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener/******************************************************************************/ 8118e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 8128e8939fc10ad63576a2785ba1333a23726b7e164Florian Krienerdng_vector operator* (real64 scale, 8138e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener const dng_vector &A) 8148e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener { 8158e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 8168e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener dng_vector B (A); 8178e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 8188e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener B.Scale (scale); 8198e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 8208e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener return B; 8218e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 8228e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener } 8238e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 8248e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener/******************************************************************************/ 8258e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 8268e8939fc10ad63576a2785ba1333a23726b7e164Florian Krienerdng_matrix operator+ (const dng_matrix &A, 8278e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener const dng_matrix &B) 8288e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener { 8298e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 8308e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener if (A.Cols () != B.Cols () || 8318e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener A.Rows () != B.Rows ()) 8328e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener { 8338e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 8348e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener ThrowMatrixMath (); 8358e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 8368e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener } 8378e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 8388e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener dng_matrix C (A); 8398e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 8408e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener for (uint32 j = 0; j < C.Rows (); j++) 8418e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener for (uint32 k = 0; k < C.Cols (); k++) 8428e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener { 8438e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 8448e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener C [j] [k] += B [j] [k]; 8458e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 8468e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener } 8478e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 8488e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener return C; 8498e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 8508e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener } 8518e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 8528e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener/******************************************************************************/ 8538e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 8548e8939fc10ad63576a2785ba1333a23726b7e164Florian Krienerconst real64 kNearZero = 1.0E-10; 8558e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 8568e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener/******************************************************************************/ 8578e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 8588e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener// Work around bug #1294195, which may be a hardware problem on a specific machine. 8598e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener// This pragma turns on "improved" floating-point consistency. 8608e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener#ifdef _MSC_VER 8618e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener#pragma optimize ("p", on) 8628e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener#endif 8638e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 8648e8939fc10ad63576a2785ba1333a23726b7e164Florian Krienerstatic dng_matrix Invert3by3 (const dng_matrix &A) 8658e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener { 8668e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 8678e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener real64 a00 = A [0] [0]; 8688e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener real64 a01 = A [0] [1]; 8698e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener real64 a02 = A [0] [2]; 8708e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener real64 a10 = A [1] [0]; 8718e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener real64 a11 = A [1] [1]; 8728e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener real64 a12 = A [1] [2]; 8738e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener real64 a20 = A [2] [0]; 8748e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener real64 a21 = A [2] [1]; 8758e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener real64 a22 = A [2] [2]; 8768e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 8778e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener real64 temp [3] [3]; 8788e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 8798e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener temp [0] [0] = a11 * a22 - a21 * a12; 8808e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener temp [0] [1] = a21 * a02 - a01 * a22; 8818e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener temp [0] [2] = a01 * a12 - a11 * a02; 8828e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener temp [1] [0] = a20 * a12 - a10 * a22; 8838e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener temp [1] [1] = a00 * a22 - a20 * a02; 8848e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener temp [1] [2] = a10 * a02 - a00 * a12; 8858e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener temp [2] [0] = a10 * a21 - a20 * a11; 8868e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener temp [2] [1] = a20 * a01 - a00 * a21; 8878e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener temp [2] [2] = a00 * a11 - a10 * a01; 8888e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 8898e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener real64 det = (a00 * temp [0] [0] + 8908e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener a01 * temp [1] [0] + 8918e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener a02 * temp [2] [0]); 8928e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 8938e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener if (Abs_real64 (det) < kNearZero) 8948e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener { 8958e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 8968e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener ThrowMatrixMath (); 8978e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 8988e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener } 8998e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 9008e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener dng_matrix B (3, 3); 9018e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 9028e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener for (uint32 j = 0; j < 3; j++) 9038e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener for (uint32 k = 0; k < 3; k++) 9048e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener { 9058e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 9068e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener B [j] [k] = temp [j] [k] / det; 9078e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 9088e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener } 9098e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 9108e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener return B; 9118e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 9128e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener } 9138e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 9148e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener// Reset floating-point optimization. See comment above. 9158e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener#ifdef _MSC_VER 9168e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener#pragma optimize ("p", off) 9178e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener#endif 9188e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 9198e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener/******************************************************************************/ 9208e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 9218e8939fc10ad63576a2785ba1333a23726b7e164Florian Krienerstatic dng_matrix InvertNbyN (const dng_matrix &A) 9228e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener { 9238e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 9248e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener uint32 i; 9258e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener uint32 j; 9268e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener uint32 k; 9278e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 9288e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener uint32 n = A.Rows (); 9298e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 9308e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener real64 temp [kMaxColorPlanes] [kMaxColorPlanes * 2]; 9318e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 9328e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener for (i = 0; i < n; i++) 9338e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener for (j = 0; j < n; j++) 9348e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener { 9358e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 9368e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener temp [i] [j ] = A [i] [j]; 9378e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 9388e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener temp [i] [j + n] = (i == j ? 1.0 : 0.0); 9398e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 9408e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener } 9418e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 9428e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener for (i = 0; i < n; i++) 9438e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener { 9448e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 9458e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener real64 alpha = temp [i] [i]; 9468e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 9478e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener if (Abs_real64 (alpha) < kNearZero) 9488e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener { 9498e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 9508e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener ThrowMatrixMath (); 9518e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 9528e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener } 9538e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 9548e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener for (j = 0; j < n * 2; j++) 9558e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener { 9568e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 9578e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener temp [i] [j] /= alpha; 9588e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 9598e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener } 9608e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 9618e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener for (k = 0; k < n; k++) 9628e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener { 9638e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 9648e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener if (i != k) 9658e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener { 9668e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 9678e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener real64 beta = temp [k] [i]; 9688e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 9698e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener for (j = 0; j < n * 2; j++) 9708e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener { 9718e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 9728e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener temp [k] [j] -= beta * temp [i] [j]; 9738e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 9748e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener } 9758e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 9768e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener } 9778e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 9788e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener } 9798e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 9808e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener } 9818e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 9828e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener dng_matrix B (n, n); 9838e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 9848e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener for (i = 0; i < n; i++) 9858e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener for (j = 0; j < n; j++) 9868e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener { 9878e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 9888e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener B [i] [j] = temp [i] [j + n]; 9898e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 9908e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener } 9918e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 9928e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener return B; 9938e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 9948e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener } 9958e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 9968e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener/******************************************************************************/ 9978e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 9988e8939fc10ad63576a2785ba1333a23726b7e164Florian Krienerdng_matrix Transpose (const dng_matrix &A) 9998e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener { 10008e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 10018e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener dng_matrix B (A.Cols (), A.Rows ()); 10028e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 10038e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener for (uint32 j = 0; j < B.Rows (); j++) 10048e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener for (uint32 k = 0; k < B.Cols (); k++) 10058e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener { 10068e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 10078e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener B [j] [k] = A [k] [j]; 10088e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 10098e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener } 10108e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 10118e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener return B; 10128e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 10138e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener } 10148e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 10158e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener/******************************************************************************/ 10168e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 10178e8939fc10ad63576a2785ba1333a23726b7e164Florian Krienerdng_matrix Invert (const dng_matrix &A) 10188e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener { 10198e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 10208e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener if (A.Rows () < 2 || A.Cols () < 2) 10218e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener { 10228e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 10238e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener ThrowMatrixMath (); 10248e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 10258e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener } 10268e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 10278e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener if (A.Rows () == A.Cols ()) 10288e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener { 10298e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 10308e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener if (A.Rows () == 3) 10318e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener { 10328e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 10338e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener return Invert3by3 (A); 10348e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 10358e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener } 10368e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 10378e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener return InvertNbyN (A); 10388e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 10398e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener } 10408e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 10418e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener else 10428e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener { 10438e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 10448e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener // Compute the pseudo inverse. 10458e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 10468e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener dng_matrix B = Transpose (A); 10478e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 10488e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener return Invert (B * A) * B; 10498e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 10508e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener } 10518e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 10528e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener } 10538e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 10548e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener/******************************************************************************/ 10558e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 10568e8939fc10ad63576a2785ba1333a23726b7e164Florian Krienerdng_matrix Invert (const dng_matrix &A, 10578e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener const dng_matrix &hint) 10588e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener { 10598e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 10608e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener if (A.Rows () == A .Cols () || 10618e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener A.Rows () != hint.Cols () || 10628e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener A.Cols () != hint.Rows ()) 10638e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener { 10648e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 10658e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener return Invert (A); 10668e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 10678e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener } 10688e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 10698e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener else 10708e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener { 10718e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 10728e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener // Use the specified hint matrix. 10738e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 10748e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener return Invert (hint * A) * hint; 10758e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 10768e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener } 10778e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 10788e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener } 10798e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 10808e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener/*****************************************************************************/ 1081