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