📄 jmatrixmathvec.h
字号:
// JMatrixMathVec
//
//
// Vector functions
//
//
// convention :
//
// R : the result matrix
//
// A : a operand matrix
// B : a operand matrix
// S : a scaler
//
// N : row / dimension of the vector
// M : column / dimension of the vector
//
// the matrix dimension is N by M, row first stored
//
// when a matrix operates whit a scaler, each element of
// this matrix operates with this scaler.
//
//
#pragma once
#include <math.h>
inline void JMatrixVecAssign( double * R, const double * V, int N )
{
// R = V
for ( int i=0 ; i<N ; i++ ) R[i] = V[i] ;
}
inline void JMatrixVecAdd( double * VR, const double * VA, const double * VB, int N )
{
// VR = VA + VB
for ( int i=0 ; i<N ; i++ ) VR[i] = VA[i] + VB[i] ;
}
inline void JMatrixVecAdd( double * VA, const double * VB, int N )
{
// VA += VB
for ( int i=0 ; i<N ; i++ ) VA[i] += VB[i] ;
}
inline void JMatrixVecAdd( double * VR, const double * VA, double S, int N )
{
// VR = VA + S
for ( int i=0 ; i<N ; i++ ) VR[i] = VA[i] + S ;
}
inline void JMatrixVecAdd( double * VA, double S, int N )
{
// VA += S
for ( int i=0 ; i<N ; i++ ) VA[i] += S ;
}
inline void JMatrixVecSub( double * VR, const double * VA, const double * VB, int N )
{
// VR = VA - VB
for ( int i=0 ; i<N ; i++ ) VR[i] = VA[i] - VB[i] ;
}
inline void JMatrixVecSub( double * VA, const double * VB, int N )
{
// VA -= VB
for ( int i=0 ; i<N ; i++ ) VA[i] -= VB[i] ;
}
inline void JMatrixVecSub( double * V, int N )
{
// V = - V
for ( int i=0 ; i<N ; i++ ) V[i] = - V[i] ;
}
inline void JMatrixVecMul( double * R, const double * A, const double * V, int N, int M )
{
// R = A * V R[ N ] A[ N ][ M ] V[ M ]
int i, j, k ;
for ( k=i=0 ; i<N ; k+=M, i++ )
{
R[i] = 0 ;
for ( j=0 ; j<M ; j++ ) R[i] += A[k+j] * V[j] ;
}
}
inline void JMatrixVecMul( double * R, const double * V, double S, int N )
{
// R = V * S R[ N ] V[ N ] S[ 1 ]
for ( int i=0 ; i<N ; i++ ) R[i] = V[i] * S ;
}
inline void JMatrixVecMul( double * V, double S, int N )
{
// V *= S V[ N ] S[ 1 ]
for ( int i=0 ; i<N ; i++ ) V[i] *= S ;
}
inline void JMatrixVecMulR( double * R, const double * V, const double * A, int N, int M )
{
// R = V * A R[ M ] A[ N ][ M ] V[ N ]
int i, j, k ;
for ( i=0 ; i<M ; i++ )
{
R[i] = 0 ;
for ( k=i, j=0 ; j<N ; k+=M, j++ ) R[i] += V[j] * A[k] ;
}
}
inline double JMatrixVecDistance( const double * VA, const double * VB, int N )
{
// | VA - VB | VA[ N ] VB[ N ]
double a, len = 0 ;
for ( int i=0 ; i<N ; i++ )
{
a = VA[i] - VB[i] ; len += a * a ;
}
return sqrt( len ) ;
}
inline void JMatrixVecDyad( double * R, const double * VA, const double * VB, int N, int M )
{
// R = VA * VB R[ N ][ M ] VA[ N ] VB[ M ]
int i, j, k ;
for ( k=i=0 ; i<N ; k+=M, i++ )
{
for ( j=0 ; j<M ; j++ ) R[k+j] = VA[i] * VB[j] ;
}
}
inline double JMatrixVecDotProduct( const double * VA, const double * VB, int N )
{
// VA .* VB VA[ N ] VB[ N ]
double len = 0 ;
for ( int i=0 ; i<N ; i++ ) len += VA[i] * VB[i] ;
return len ;
}
inline double JMatrixVecDotProduct( const double * V, int N )
{
// V .* V = | V |^2 V[ N ]
double len = 0 ;
for ( int i=0 ; i<N ; i++ ) len += V[i] * V[i] ;
return len ;
}
inline double JMatrixVecLength( const double * V, int N )
{
// | V | V[ N ]
int i ; double len = 0 ;
for ( i=0 ; i<N ; i++ ) len += V[i] * V[i] ;
return sqrt( len ) ;
}
inline void JMatrixVecNormalize( double * V, int N )
{
// V = V / | V | V[ N ]
int i ; double len = 0 ;
for ( i=0 ; i<N ; i++ ) len += V[i] * V[i] ;
len = sqrt( len ) ;
for ( i=0 ; i<N ; i++ ) V[i] /= len ;
}
inline double JMatrixVecMaxEle( const double * V, int N )
{
// maximum element of V, int terms of absolute value
// the return value is an absolute value
double a = 0, b = 0 ;
for ( int i=0 ; i<N ; i++ )
{
if ( a < ( b = fabs(V[i]) ) ) a = b ;
}
return a ;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -