www.pudn.com > Image_segment.rar > Functions.cpp
//Copyright (c) 2004-2005, Baris Sumengen
//All rights reserved.
//
// CIMPL Matrix Performance Library
//
//Redistribution and use in source and binary
//forms, with or without modification, are
//permitted provided that the following
//conditions are met:
//
// * No commercial use is allowed.
// This software can only be used
// for non-commercial purposes. This
// distribution is mainly intended for
// academic research and teaching.
// * Redistributions of source code must
// retain the above copyright notice, this
// list of conditions and the following
// disclaimer.
// * Redistributions of binary form must
// mention the above copyright notice, this
// list of conditions and the following
// disclaimer in a clearly visible part
// in associated product manual,
// readme, and web site of the redistributed
// software.
// * Redistributions in binary form must
// reproduce the above copyright notice,
// this list of conditions and the
// following disclaimer in the
// documentation and/or other materials
// provided with the distribution.
// * The name of Baris Sumengen may not be
// used to endorse or promote products
// derived from this software without
// specific prior written permission.
//
//THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT
//HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
//EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT
//NOT LIMITED TO, THE IMPLIED WARRANTIES OF
//MERCHANTABILITY AND FITNESS FOR A PARTICULAR
//PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
//CONTRIBUTORS BE LIABLE FOR ANY
//DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
//EXEMPLARY, OR CONSEQUENTIAL DAMAGES
//(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
//OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
//DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
//HOWEVER CAUSED AND ON ANY THEORY OF
//LIABILITY, WHETHER IN CONTRACT, STRICT
//LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
//OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
//OF THIS SOFTWARE, EVEN IF ADVISED OF THE
//POSSIBILITY OF SUCH DAMAGE.
#include "./Functions.h"
#include "mkl_vml.h"
namespace MathCore
{
// Inverts elements
Vector Inv(Vector& m)
{
Vector temp(m.Length());
vsInv(m.Length(), m.Data(), temp.Data());
return temp;
}
Vector Inv(Vector& m)
{
Vector temp(m.Length());
vdInv(m.Length(), m.Data(), temp.Data());
return temp;
}
Matrix Inv(Matrix& m)
{
Matrix temp(m.Rows(), m.Columns());
vsInv(m.Length(), m.Data(), temp.Data());
return temp;
}
Matrix Inv(Matrix& m)
{
Matrix temp(m.Rows(), m.Columns());
vdInv(m.Length(), m.Data(), temp.Data());
return temp;
}
Vector& InvI(Vector& m)
{
vsInv(m.Length(), m.Data(), m.Data());
return m;
}
Vector& InvI(Vector& m)
{
vdInv(m.Length(), m.Data(), m.Data());
return m;
}
Matrix& InvI(Matrix& m)
{
vsInv(m.Length(), m.Data(), m.Data());
return m;
}
Matrix& InvI(Matrix& m)
{
vdInv(m.Length(), m.Data(), m.Data());
return m;
}
// Division of elements
Vector Div(Vector& m1, Vector& m2)
{
if(m1.Length() != m2.Length())
{
cerr << "Line: " << __LINE__ << " File: " << __FILE__ << endl;
Utility::RunTimeError("Vector lengths are not the same!");
}
Vector temp(m1.Length());
vsDiv(m1.Length(), m1.Data(), m2.Data(), temp.Data());
return temp;
}
Vector Div(Vector& m1, Vector& m2)
{
if(m1.Length() != m2.Length())
{
cerr << "Line: " << __LINE__ << " File: " << __FILE__ << endl;
Utility::RunTimeError("Vector lengths are not the same!");
}
Vector temp(m1.Length());
vdDiv(m1.Length(), m1.Data(), m2.Data(), temp.Data());
return temp;
}
Matrix Div(Matrix& m1, Matrix& m2)
{
if(m1.Rows() != m2.Rows() || m1.Columns() != m2.Columns())
{
cerr << "Line: " << __LINE__ << " File: " << __FILE__ << endl;
Utility::RunTimeError("Matrix dimensions does not match!");
}
Matrix temp(m1.Rows(), m1.Columns());
vsDiv(m1.Length(), m1.Data(), m2.Data(), temp.Data());
return temp;
}
Matrix Div(Matrix& m1, Matrix& m2)
{
if(m1.Rows() != m2.Rows() || m1.Columns() != m2.Columns())
{
cerr << "Line: " << __LINE__ << " File: " << __FILE__ << endl;
Utility::RunTimeError("Matrix dimensions does not match!");
}
Matrix temp(m1.Rows(), m1.Columns());
vdDiv(m1.Length(), m1.Data(), m2.Data(), temp.Data());
return temp;
}
Vector& DivI(Vector& m1, Vector& m2)
{
if(m1.Length() != m2.Length())
{
cerr << "Line: " << __LINE__ << " File: " << __FILE__ << endl;
Utility::RunTimeError("Vector lengths are not the same!");
}
vsDiv(m1.Length(), m1.Data(), m2.Data(), m1.Data());
return m1;
}
Vector& DivI(Vector& m1, Vector& m2)
{
if(m1.Length() != m2.Length())
{
cerr << "Line: " << __LINE__ << " File: " << __FILE__ << endl;
Utility::RunTimeError("Vector lengths are not the same!");
}
vdDiv(m1.Length(), m1.Data(), m2.Data(), m1.Data());
return m1;
}
Matrix& DivI(Matrix& m1, Matrix& m2)
{
if(m1.Rows() != m2.Rows() || m1.Columns() != m2.Columns())
{
cerr << "Line: " << __LINE__ << " File: " << __FILE__ << endl;
Utility::RunTimeError("Matrix dimensions does not match!");
}
vsDiv(m1.Length(), m1.Data(), m2.Data(), m1.Data());
return m1;
}
Matrix& DivI(Matrix& m1, Matrix& m2)
{
if(m1.Rows() != m2.Rows() || m1.Columns() != m2.Columns())
{
cerr << "Line: " << __LINE__ << " File: " << __FILE__ << endl;
Utility::RunTimeError("Matrix dimensions does not match!");
}
vdDiv(m1.Length(), m1.Data(), m2.Data(), m1.Data());
return m1;
}
// Square root of elements
Vector Sqrt(Vector& m)
{
Vector temp(m.Length());
vsSqrt(m.Length(), m.Data(), temp.Data());
return temp;
}
Vector Sqrt(Vector& m)
{
Vector temp(m.Length());
vdSqrt(m.Length(), m.Data(), temp.Data());
return temp;
}
Matrix Sqrt(Matrix& m)
{
Matrix temp(m.Rows(), m.Columns());
vsSqrt(m.Length(), m.Data(), temp.Data());
return temp;
}
Matrix Sqrt(Matrix& m)
{
Matrix temp(m.Rows(), m.Columns());
vdSqrt(m.Length(), m.Data(), temp.Data());
return temp;
}
Vector& SqrtI(Vector& m)
{
vsSqrt(m.Length(), m.Data(), m.Data());
return m;
}
Vector& SqrtI(Vector& m)
{
vdSqrt(m.Length(), m.Data(), m.Data());
return m;
}
Matrix& SqrtI(Matrix& m)
{
vsSqrt(m.Length(), m.Data(), m.Data());
return m;
}
Matrix& SqrtI(Matrix& m)
{
vdSqrt(m.Length(), m.Data(), m.Data());
return m;
}
// Inverse Square root of elements
Vector InvSqrt(Vector& m)
{
Vector temp(m.Length());
vsInvSqrt(m.Length(), m.Data(), temp.Data());
return temp;
}
Vector InvSqrt(Vector& m)
{
Vector temp(m.Length());
vdInvSqrt(m.Length(), m.Data(), temp.Data());
return temp;
}
Matrix InvSqrt(Matrix& m)
{
Matrix temp(m.Rows(), m.Columns());
vsInvSqrt(m.Length(), m.Data(), temp.Data());
return temp;
}
Matrix InvSqrt(Matrix& m)
{
Matrix temp(m.Rows(), m.Columns());
vdInvSqrt(m.Length(), m.Data(), temp.Data());
return temp;
}
Vector& InvSqrtI(Vector& m)
{
vsInvSqrt(m.Length(), m.Data(), m.Data());
return m;
}
Vector& InvSqrtI(Vector& m)
{
vdInvSqrt(m.Length(), m.Data(), m.Data());
return m;
}
Matrix& InvSqrtI(Matrix& m)
{
vsInvSqrt(m.Length(), m.Data(), m.Data());
return m;
}
Matrix& InvSqrtI(Matrix& m)
{
vdInvSqrt(m.Length(), m.Data(), m.Data());
return m;
}
// Cube root of elements
Vector Cbrt(Vector& m)
{
Vector temp(m.Length());
vsCbrt(m.Length(), m.Data(), temp.Data());
return temp;
}
Vector Cbrt(Vector& m)
{
Vector temp(m.Length());
vdCbrt(m.Length(), m.Data(), temp.Data());
return temp;
}
Matrix Cbrt(Matrix& m)
{
Matrix temp(m.Rows(), m.Columns());
vsCbrt(m.Length(), m.Data(), temp.Data());
return temp;
}
Matrix Cbrt(Matrix& m)
{
Matrix temp(m.Rows(), m.Columns());
vdCbrt(m.Length(), m.Data(), temp.Data());
return temp;
}
Vector& CbrtI(Vector& m)
{
vsCbrt(m.Length(), m.Data(), m.Data());
return m;
}
Vector& CbrtI(Vector& m)
{
vdCbrt(m.Length(), m.Data(), m.Data());
return m;
}
Matrix& CbrtI(Matrix& m)
{
vsCbrt(m.Length(), m.Data(), m.Data());
return m;
}
Matrix& CbrtI(Matrix& m)
{
vdCbrt(m.Length(), m.Data(), m.Data());
return m;
}
// Cube root of elements
Vector InvCbrt(Vector& m)
{
Vector temp(m.Length());
vsInvCbrt(m.Length(), m.Data(), temp.Data());
return temp;
}
Vector InvCbrt(Vector& m)
{
Vector temp(m.Length());
vdInvCbrt(m.Length(), m.Data(), temp.Data());
return temp;
}
Matrix InvCbrt(Matrix& m)
{
Matrix temp(m.Rows(), m.Columns());
vsInvCbrt(m.Length(), m.Data(), temp.Data());
return temp;
}
Matrix InvCbrt(Matrix& m)
{
Matrix temp(m.Rows(), m.Columns());
vdInvCbrt(m.Length(), m.Data(), temp.Data());
return temp;
}
Vector& InvCbrtI(Vector& m)
{
vsInvCbrt(m.Length(), m.Data(), m.Data());
return m;
}
Vector& InvCbrtI(Vector& m)
{
vdInvCbrt(m.Length(), m.Data(), m.Data());
return m;
}
Matrix& InvCbrtI(Matrix& m)
{
vsInvCbrt(m.Length(), m.Data(), m.Data());
return m;
}
Matrix& InvCbrtI(Matrix& m)
{
vdInvCbrt(m.Length(), m.Data(), m.Data());
return m;
}
// Pow of elements
Vector Pow(Vector& m1, Vector& m2)
{
if(m1.Length() != m2.Length())
{
cerr << "Line: " << __LINE__ << " File: " << __FILE__ << endl;
Utility::RunTimeError("Vector lengths are not the same!");
}
Vector temp(m1.Length());
vsPow(m1.Length(), m1.Data(), m2.Data(), temp.Data());
return temp;
}
Vector Pow(Vector& m1, Vector& m2)
{
if(m1.Length() != m2.Length())
{
cerr << "Line: " << __LINE__ << " File: " << __FILE__ << endl;
Utility::RunTimeError("Vector lengths are not the same!");
}
Vector temp(m1.Length());
vdPow(m1.Length(), m1.Data(), m2.Data(), temp.Data());
return temp;
}
Matrix Pow(Matrix& m1, Matrix& m2)
{
if(m1.Rows() != m2.Rows() || m1.Columns() != m2.Columns())
{
cerr << "Line: " << __LINE__ << " File: " << __FILE__ << endl;
Utility::RunTimeError("Matrix dimensions does not match!");
}
Matrix temp(m1.Rows(), m1.Columns());
vsPow(m1.Length(), m1.Data(), m2.Data(), temp.Data());
return temp;
}
Matrix Pow(Matrix& m1, Matrix& m2)
{
if(m1.Rows() != m2.Rows() || m1.Columns() != m2.Columns())
{
cerr << "Line: " << __LINE__ << " File: " << __FILE__ << endl;
Utility::RunTimeError("Matrix dimensions does not match!");
}
Matrix temp(m1.Rows(), m1.Columns());
vdPow(m1.Length(), m1.Data(), m2.Data(), temp.Data());
return temp;
}
Vector& PowI(Vector& m1, Vector& m2)
{
if(m1.Length() != m2.Length())
{
cerr << "Line: " << __LINE__ << " File: " << __FILE__ << endl;
Utility::RunTimeError("Vector lengths are not the same!");
}
vsPow(m1.Length(), m1.Data(), m2.Data(), m1.Data());
return m1;
}
Vector& PowI(Vector& m1, Vector& m2)
{
if(m1.Length() != m2.Length())
{
cerr << "Line: " << __LINE__ << " File: " << __FILE__ << endl;
Utility::RunTimeError("Vector lengths are not the same!");
}
vdPow(m1.Length(), m1.Data(), m2.Data(), m1.Data());
return m1;
}
Matrix& PowI(Matrix& m1, Matrix& m2)
{
if(m1.Rows() != m2.Rows() || m1.Columns() != m2.Columns())
{
cerr << "Line: " << __LINE__ << " File: " << __FILE__ << endl;
Utility::RunTimeError("Matrix dimensions does not match!");
}
vsPow(m1.Length(), m1.Data(), m2.Data(), m1.Data());
return m1;
}
Matrix& PowI(Matrix& m1, Matrix& m2)
{
if(m1.Rows() != m2.Rows() || m1.Columns() != m2.Columns())
{
cerr << "Line: " << __LINE__ << " File: " << __FILE__ << endl;
Utility::RunTimeError("Matrix dimensions does not match!");
}
vdPow(m1.Length(), m1.Data(), m2.Data(), m1.Data());
return m1;
}
// Pow of vector elements to a constant
Vector Powx(Vector& m1, const float m2)
{
Vector temp(m1.Length());
vsPowx(m1.Length(), m1.Data(), m2, temp.Data());
return temp;
}
Vector Powx(Vector& m1, const double m2)
{
Vector temp(m1.Length());
vdPowx(m1.Length(), m1.Data(), m2, temp.Data());
return temp;
}
Matrix Powx(Matrix& m1, const float m2)
{
Matrix temp(m1.Rows(), m1.Columns());
vsPowx(m1.Length(), m1.Data(), m2, temp.Data());
return temp;
}
Matrix Powx(Matrix& m1, const double m2)
{
Matrix temp(m1.Rows(), m1.Columns());
vdPowx(m1.Length(), m1.Data(), m2, temp.Data());
return temp;
}
Vector& PowxI(Vector& m1, const float m2)
{
vsPowx(m1.Length(), m1.Data(), m2, m1.Data());
return m1;
}
Vector& PowxI(Vector& m1, const double m2)
{
vdPowx(m1.Length(), m1.Data(), m2, m1.Data());
return m1;
}
Matrix& PowxI(Matrix& m1, const float m2)
{
vsPowx(m1.Length(), m1.Data(), m2, m1.Data());
return m1;
}
Matrix& PowxI(Matrix& m1, const double m2)
{
vdPowx(m1.Length(), m1.Data(), m2, m1.Data());
return m1;
}
// Exponent of elements
Vector Exp(Vector& m)
{
Vector temp(m.Length());
vsExp(m.Length(), m.Data(), temp.Data());
return temp;
}
Vector Exp(Vector& m)
{
Vector temp(m.Length());
vdExp(m.Length(), m.Data(), temp.Data());
return temp;
}
Matrix Exp(Matrix& m)
{
Matrix temp(m.Rows(), m.Columns());
vsExp(m.Length(), m.Data(), temp.Data());
return temp;
}
Matrix Exp(Matrix& m)
{
Matrix temp(m.Rows(), m.Columns());
vdExp(m.Length(), m.Data(), temp.Data());
return temp;
}
Vector& ExpI(Vector& m)
{
vsExp(m.Length(), m.Data(), m.Data());
return m;
}
Vector& ExpI(Vector& m)
{
vdExp(m.Length(), m.Data(), m.Data());
return m;
}
Matrix& ExpI(Matrix& m)
{
vsExp(m.Length(), m.Data(), m.Data());
return m;
}
Matrix& ExpI(Matrix& m)
{
vdExp(m.Length(), m.Data(), m.Data());
return m;
}
// Ln of elements
Vector Ln(Vector& m)
{
Vector temp(m.Length());
vsLn(m.Length(), m.Data(), temp.Data());
return temp;
}
Vector Ln(Vector& m)
{
Vector temp(m.Length());
vdLn(m.Length(), m.Data(), temp.Data());
return temp;
}
Matrix Ln(Matrix& m)
{
Matrix temp(m.Rows(), m.Columns());
vsLn(m.Length(), m.Data(), temp.Data());
return temp;
}
Matrix Ln(Matrix& m)
{
Matrix temp(m.Rows(), m.Columns());
vdLn(m.Length(), m.Data(), temp.Data());
return temp;
}
Vector& LnI(Vector& m)
{
vsLn(m.Length(), m.Data(), m.Data());
return m;
}
Vector& LnI(Vector& m)
{
vdLn(m.Length(), m.Data(), m.Data());
return m;
}
Matrix& LnI(Matrix& m)
{
vsLn(m.Length(), m.Data(), m.Data());
return m;
}
Matrix& LnI(Matrix& m)
{
vdLn(m.Length(), m.Data(), m.Data());
return m;
}
// Log10 of elements
Vector Log10(Vector& m)
{
Vector temp(m.Length());
vsLog10(m.Length(), m.Data(), temp.Data());
return temp;
}
Vector Log10(Vector& m)
{
Vector temp(m.Length());
vdLog10(m.Length(), m.Data(), temp.Data());
return temp;
}
Matrix Log10(Matrix& m)
{
Matrix temp(m.Rows(), m.Columns());
vsLog10(m.Length(), m.Data(), temp.Data());
return temp;
}
Matrix Log10(Matrix& m)
{
Matrix temp(m.Rows(), m.Columns());
vdLog10(m.Length(), m.Data(), temp.Data());
return temp;
}
Vector& Log10I(Vector& m)
{
vsLog10(m.Length(), m.Data(), m.Data());
return m;
}
Vector& Log10I(Vector& m)
{
vdLog10(m.Length(), m.Data(), m.Data());
return m;
}
Matrix& Log10I(Matrix& m)
{
vsLog10(m.Length(), m.Data(), m.Data());
return m;
}
Matrix& Log10I(Matrix& m)
{
vdLog10(m.Length(), m.Data(), m.Data());
return m;
}
// Cos of elements
Vector Cos(Vector& m)
{
Vector temp(m.Length());
vsCos(m.Length(), m.Data(), temp.Data());
return temp;
}
Vector Cos(Vector& m)
{
Vector temp(m.Length());
vdCos(m.Length(), m.Data(), temp.Data());
return temp;
}
Matrix Cos(Matrix& m)
{
Matrix temp(m.Rows(), m.Columns());
vsCos(m.Length(), m.Data(), temp.Data());
return temp;
}
Matrix Cos(Matrix& m)
{
Matrix temp(m.Rows(), m.Columns());
vdCos(m.Length(), m.Data(), temp.Data());
return temp;
}
Vector& CosI(Vector& m)
{
vsCos(m.Length(), m.Data(), m.Data());
return m;
}
Vector& CosI(Vector& m)
{
vdCos(m.Length(), m.Data(), m.Data());
return m;
}
Matrix& CosI(Matrix& m)
{
vsCos(m.Length(), m.Data(), m.Data());
return m;
}
Matrix