头文件:
/*
* Copyright (c) 2008-2011 Zhang Ming (M. Zhang), zmjerry@163.com
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation, either version 2 or any later version.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* 2. 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.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details. A copy of the GNU General Public License is available at:
* http://www.fsf.org/licensing/licenses
*/
/*****************************************************************************
* matrixmath.h
*
* This file provides the basic math functions such as:
* cos sin tan acos asin atan
* abs exp log log10 sqrt pow
*
* When debugging, use #define BOUNDS_CHECK above your "#include matrix.h"
* line. When done debugging, comment out #define BOUNDS_CHECK for better
* performance.
*
* Zhang Ming, 2010-01 (revised 2010-08), Xi'an Jiaotong University.
*****************************************************************************/
#ifndef MATRIXMATH_H
#define MATRIXMATH_H
#include <matrix.h>
namespace splab
{
template<typename Type> Matrix<Type> abs( const Matrix<Type>& );
template<typename Type> Matrix<Type> cos( const Matrix<Type>& );
template<typename Type> Matrix<Type> sin( const Matrix<Type>& );
template<typename Type> Matrix<Type> tan( const Matrix<Type>& );
template<typename Type> Matrix<Type> acos( const Matrix<Type>& );
template<typename Type> Matrix<Type> asin( const Matrix<Type>& );
template<typename Type> Matrix<Type> atan( const Matrix<Type>& );
template<typename Type> Matrix<Type> exp( const Matrix<Type>& );
template<typename Type> Matrix<Type> log( const Matrix<Type>& );
template<typename Type> Matrix<Type> log10( const Matrix<Type>& );
template<typename Type> Matrix<Type> sqrt( const Matrix<Type>& );
template<typename Type> Matrix<Type> pow( const Matrix<Type>&,
const Matrix<Type>& );
template<typename Type> Matrix<Type> pow( const Matrix<Type>&,
const Type& );
template<typename Type> Matrix<Type> pow( const Type&,
const Matrix<Type>& );
#include <matrixmath-impl.h>
}
// namespace splab
#endif
// MATRIXMATH_H
实现文件:
/*
* Copyright (c) 2008-2011 Zhang Ming (M. Zhang), zmjerry@163.com
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation, either version 2 or any later version.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* 2. 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.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details. A copy of the GNU General Public License is available at:
* http://www.fsf.org/licensing/licenses
*/
/*****************************************************************************
* vector-impl.h
*
* Implementation for Matrix math functions.
*
* Zhang Ming, 2010-08, Xi'an Jiaotong University.
*****************************************************************************/
template <typename Type>
Matrix<Type> abs( const Matrix<Type> &A )
{
int m = A.rows(),
n = A.cols();
Matrix<Type> tmp( m, n );
for( int i=0; i<m; ++i )
for( int j=0; j<n; ++j )
tmp[i][j] = abs( A[i][j] );
return tmp;
}
template <typename Type>
Matrix<Type> cos( const Matrix<Type> &A )
{
int m = A.rows(),
n = A.cols();
Matrix<Type> tmp( m, n );
for( int i=0; i<m; ++i )
for( int j=0; j<n; ++j )
tmp[i][j] = cos( A[i][j] );
return tmp;
}
template <typename Type>
Matrix<Type> sin( const Matrix<Type> &A )
{
int m = A.rows(),
n = A.cols();
Matrix<Type> tmp( m, n );
for( int i=0; i<m; ++i )
for( int j=0; j<n; ++j )
tmp[i][j] = sin( A[i][j] );
return tmp;
}
template <typename Type>
Matrix<Type> tan( const Matrix<Type> &A )
{
int m = A.rows(),
n = A.cols();
Matrix<Type> tmp( m, n );
for( int i=0; i<m; ++i )
for( int j=0; j<n; ++j )
tmp[i][j] = tan( A[i][j] );
return tmp;
}
template <typename Type>
Matrix<Type> acos( const Matrix<Type> &A )
{
int m = A.rows(),
n = A.cols();
Matrix<Type> tmp( m, n );
for( int i=0; i<m; ++i )
for( int j=0; j<n; ++j )
tmp[i][j] = acos( A[i][j] );
return tmp;
}
template <typename Type>
Matrix<Type> asin( const Matrix<Type> &A )
{
int m = A.rows(),
n = A.cols();
Matrix<Type> tmp( m, n );
for( int i=0; i<m; ++i )
for( int j=0; j<n; ++j )
tmp[i][j] = asin( A[i][j] );
return tmp;
}
template <typename Type>
Matrix<Type> atan( const Matrix<Type> &A )
{
int m = A.rows(),
n = A.cols();
Matrix<Type> tmp( m, n );
for( int i=0; i<m; ++i )
for( int j=0; j<n; ++j )
tmp[i][j] = atan( A[i][j] );
return tmp;
}
template <typename Type>
Matrix<Type> exp( const Matrix<Type> &A )
{
int m = A.rows(),
n = A.cols();
Matrix<Type> tmp( m, n );
for( int i=0; i<m; ++i )
for( int j=0; j<n; ++j )
tmp[i][j] = exp( A[i][j] );
return tmp;
}
template <typename Type>
Matrix<Type> log( const Matrix<Type> &A )
{
int m = A.rows(),
n = A.cols();
Matrix<Type> tmp( m, n );
for( int i=0; i<m; ++i )
for( int j=0; j<n; ++j )
tmp[i][j] = log( A[i][j] );
return tmp;
}
template <typename Type>
Matrix<Type> log10( const Matrix<Type> &A )
{
int m = A.rows(),
n = A.cols();
Matrix<Type> tmp( m, n );
for( int i=0; i<m; ++i )
for( int j=0; j<n; ++j )
tmp[i][j] = log10( A[i][j] );
return tmp;
}
template <typename Type>
Matrix<Type> sqrt( const Matrix<Type> &A )
{
int m = A.rows(),
n = A.cols();
Matrix<Type> tmp( m, n );
for( int i=0; i<m; ++i )
for( int j=0; j<n; ++j )
tmp[i][j] = sqrt( A[i][j] );
return tmp;
}
template <typename Type>
Matrix<Type> pow( const Matrix<Type> &B, const Matrix<Type> &E )
{
int m = B.rows(),
n = B.cols();
assert( m == E.rows() );
assert( n == E.cols() );
Matrix<Type> tmp( m, n );
for( int i=0; i<m; ++i )
for( int j=0; j<n; ++j )
tmp[i][j] = pow( B[i][j], E[i][j] );
return tmp;
}
template <typename Type>
Matrix<Type> pow( const Matrix<Type> &B, const Type &e )
{
int m = B.rows(),
n = B.cols();
Matrix<Type> tmp( m, n );
for( int i=0; i<m; ++i )
for( int j=0; j<n; ++j )
tmp[i][j] = pow( B[i][j], e );
return tmp;
}
template <typename Type>
Matrix<Type> pow( const Type &b, const Matrix<Type> &E )
{
int m = E.rows(),
n = E.cols();
Matrix<Type> tmp( m, n );
for( int i=0; i<m; ++i )
for( int j=0; j<n; ++j )
tmp[i][j] = pow( b, E[i][j] );
return tmp;
}
测试代码:
/*****************************************************************************
* matrixmath_test.cpp
*
* Math functions of matrix testing.
*
* Zhang Ming, 2010-08, Xi'an Jiaotong University.
*****************************************************************************/
#define BOUNDS_CHECK
#include <iostream>
#include <iomanip>
#include <matrixmath.h>
using namespace std;
using namespace splab;
typedef double Type;
int main()
{
int N = 9;
Type a = 0, b = 2*PI;
Vector<Type> array = linspace( a, b, N );
Matrix<Type> x( 3, 3, array );
cout << setiosflags(ios::fixed) << setprecision(4);
cout << x << endl;
cout << "sin of x : " << sin(x) << endl;
cout << "cos of x : "<< cos(x) << endl;
cout << "tan of x : " << tan(x) << endl;
cout << "asin of x : "<< asin(x) << endl;
cout << "acos of x : " << acos(x) << endl;
cout << "atan of x : " << atan(x) << endl;
cout << "exp of x : "<< exp(x) << endl;
cout << "log of x : " << log(x) << endl;
cout << "log10 of x : " << log10(x) << endl;
a = 2.0;
cout << "sqrt of x : "<< sqrt(x) << endl;
cout << "pow of x : " << pow(x,x) << endl;
cout << "pow of x : " << pow(x,a) << endl;
cout << "pow of x : " << pow(a,x) << endl;
return 0;
}
运行结果:
size: 3 by 3
0.0000 0.7854 1.5708
2.3562 3.1416 3.9270
4.7124 5.4978 6.2832
sin of x : size: 3 by 3
0.0000 0.7071 1.0000
0.7071 0.0000 -0.7071
-1.0000 -0.7071 -0.0000
cos of x : size: 3 by 3
1.0000 0.7071 0.0000
-0.7071 -1.0000 -0.7071
-0.0000 0.7071 1.0000
tan of x : size: 3 by 3
0.0000 1.0000 16331778728383844.0000
-1.0000 -0.0000 1.0000
5443926242794615.0000 -1.0000 -0.0000
asin of x : size: 3 by 3
0.0000 0.9033 nan
nan nan nan
nan nan nan
acos of x : size: 3 by 3
1.5708 0.6675 nan
nan nan nan
nan nan nan
atan of x : size: 3 by 3
0.0000 0.6658 1.0039
1.1694 1.2626 1.3214
1.3617 1.3909 1.4130
exp of x : size: 3 by 3
1.0000 2.1933 4.8105
10.5507 23.1407 50.7540
111.3178 244.1511 535.4917
log of x : size: 3 by 3
-inf -0.2416 0.4516
0.8570 1.1447 1.3679
1.5502 1.7043 1.8379
log10 of x : size: 3 by 3
-inf -0.1049 0.1961
0.3722 0.4971 0.5941
0.6732 0.7402 0.7982
sqrt of x : size: 3 by 3
0.0000 0.8862 1.2533
1.5350 1.7725 1.9817
2.1708 2.3447 2.5066
pow of x : size: 3 by 3
1.0000 0.8272 2.0327
7.5336 36.4622 215.2126
1487.9012 11732.6371 103540.9204
pow of x : size: 3 by 3
0.0000 0.6169 2.4674
5.5517 9.8696 15.4213
22.2066 30.2257 39.4784
pow of x : size: 3 by 3
1.0000 1.7236 2.9707
5.1202 8.8250 15.2104
26.2162 45.1855 77.8802
Process returned 0 (0x0) execution time : 0.109 s
Press any key to continue.