mirror of
https://gitlab.com/libeigen/eigen.git
synced 2026-04-10 11:34:33 +08:00
The size_t type means a number of _bytes_, and it was misused as counting e.g. the number of rows/columns in a matrix. Moreover, it is unsigned, which can give strange bugs if a signed/unsigned mismatch occurs.
192 lines
3.7 KiB
C++
192 lines
3.7 KiB
C++
/*
|
|
* Tiny Vector Matrix Library
|
|
* Dense Vector Matrix Libary of Tiny size using Expression Templates
|
|
*
|
|
* Copyright (C) 2001 - 2003 Olaf Petzold <opetzold@users.sourceforge.net>
|
|
*
|
|
* This library is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU Lesser General Public
|
|
* License as published by the Free Software Foundation; either
|
|
* version 2.1 of the License, or (at your option) any later version.
|
|
*
|
|
* This library 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
|
|
* Lesser General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU Lesser General Public
|
|
* License along with this library; if not, write to the Free Software
|
|
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
*
|
|
* $Id: frob_matrix_norm.cc,v 1.3 2003/11/30 08:26:25 opetzold Exp $
|
|
*/
|
|
|
|
#include <iostream>
|
|
#include <tvmet/Matrix.h>
|
|
#include <tvmet/xpr/Vector.h>
|
|
|
|
using namespace std;
|
|
|
|
template<class T, int Rows, int Cols>
|
|
double
|
|
frob_norm(const tvmet::Matrix<T, Rows, Cols>& M) {
|
|
return std::sqrt(M(0,0)*M(0,0) + M(1,0)*M(1,0) + M(2,0)*M(2,0)
|
|
+ M(0,1)*M(0,1) + M(1,1)*M(1,1) + M(2,1)*M(2,1)
|
|
+ M(0,2)*M(0,2) + M(1,2)*M(1,2) + M(2,2)*M(2,2));
|
|
}
|
|
|
|
namespace tvmet {
|
|
template<class T, int Rows, int Cols>
|
|
typename NumericTraits<T>::float_type
|
|
norm(const Matrix<T, Rows, Cols>& M) {
|
|
return std::sqrt( sum( diag( MtM_prod(M,M) ) ) );
|
|
}
|
|
}
|
|
|
|
int main()
|
|
{
|
|
typedef tvmet::Matrix<double,3,3> matrix_type;
|
|
|
|
matrix_type M;
|
|
|
|
M = 1,2,3,4,5,6,7,8,9;
|
|
cout << M << endl;
|
|
|
|
cout << "handopt norm = " << frob_norm(M) << endl;
|
|
cout << "tvmet::norm = " << tvmet::norm(M) << endl;
|
|
}
|
|
|
|
/*
|
|
gcc 3.3 produce for the hand optimized frob_norm:
|
|
|
|
_Z9frob_normIdLj3ELj3EEdRKN5tvmet6MatrixIT_XT0_EXT1_EEE:
|
|
.LFB3210:
|
|
pushl %ebp
|
|
.LCFI6:
|
|
movl %esp, %ebp
|
|
.LCFI7:
|
|
subl $8, %esp
|
|
.LCFI8:
|
|
movl 8(%ebp), %eax
|
|
fldl (%eax)
|
|
fldl 24(%eax)
|
|
fxch %st(1)
|
|
fmul %st(0), %st
|
|
fxch %st(1)
|
|
fmul %st(0), %st
|
|
faddp %st, %st(1)
|
|
fldl 48(%eax)
|
|
fmul %st(0), %st
|
|
faddp %st, %st(1)
|
|
fldl 8(%eax)
|
|
fmul %st(0), %st
|
|
faddp %st, %st(1)
|
|
fldl 32(%eax)
|
|
fmul %st(0), %st
|
|
faddp %st, %st(1)
|
|
fldl 56(%eax)
|
|
fmul %st(0), %st
|
|
faddp %st, %st(1)
|
|
fldl 16(%eax)
|
|
fmul %st(0), %st
|
|
faddp %st, %st(1)
|
|
fldl 40(%eax)
|
|
fmul %st(0), %st
|
|
faddp %st, %st(1)
|
|
fldl 64(%eax)
|
|
fmul %st(0), %st
|
|
faddp %st, %st(1)
|
|
fld %st(0)
|
|
fsqrt
|
|
fucom %st(0)
|
|
fnstsw %ax
|
|
sahf
|
|
jp .L189
|
|
jne .L189
|
|
fstp %st(1)
|
|
.L186:
|
|
leave
|
|
ret
|
|
|
|
*/
|
|
|
|
/*
|
|
gcc 3.3 produce the norm function using tvmet 1.3.0:
|
|
|
|
_ZN5tvmet4normIdLj3ELj3EEENS_13NumericTraitsIT_E10float_typeERKNS_6MatrixIS2_XT0_EXT1_EEE:
|
|
.LFB3252:
|
|
.L194:
|
|
.L198:
|
|
.L203:
|
|
.L207:
|
|
.L212:
|
|
.L225:
|
|
.L238:
|
|
.L251:
|
|
pushl %ebp
|
|
.LCFI9:
|
|
movl %esp, %ebp
|
|
.LCFI10:
|
|
subl $56, %esp
|
|
.LCFI11:
|
|
movl 8(%ebp), %edx
|
|
leal -24(%ebp), %eax
|
|
movl %eax, -12(%ebp)
|
|
leal -12(%ebp), %eax
|
|
fldl 24(%edx)
|
|
fldl 48(%edx)
|
|
fldl (%edx)
|
|
fxch %st(2)
|
|
fmul %st(0), %st
|
|
fxch %st(1)
|
|
movl %eax, -28(%ebp)
|
|
fmul %st(0), %st
|
|
fxch %st(2)
|
|
movl %edx, -24(%ebp)
|
|
movl %edx, -20(%ebp)
|
|
fmul %st(0), %st
|
|
fldl 8(%edx)
|
|
fxch %st(2)
|
|
faddp %st, %st(3)
|
|
fldl 56(%edx)
|
|
fxch %st(2)
|
|
fmul %st(0), %st
|
|
fxch %st(1)
|
|
faddp %st, %st(3)
|
|
fldl 32(%edx)
|
|
fxch %st(2)
|
|
fmul %st(0), %st
|
|
fxch %st(2)
|
|
fmul %st(0), %st
|
|
fldl 16(%edx)
|
|
fxch %st(1)
|
|
faddp %st, %st(3)
|
|
fmul %st(0), %st
|
|
fldl 64(%edx)
|
|
fxch %st(2)
|
|
faddp %st, %st(3)
|
|
fldl 40(%edx)
|
|
fxch %st(2)
|
|
fmul %st(0), %st
|
|
fxch %st(2)
|
|
fmul %st(0), %st
|
|
faddp %st, %st(2)
|
|
faddp %st, %st(1)
|
|
faddp %st, %st(1)
|
|
faddp %st, %st(1)
|
|
fld %st(0)
|
|
fsqrt
|
|
fucom %st(0)
|
|
fnstsw %ax
|
|
sahf
|
|
jp .L265
|
|
jne .L265
|
|
fstp %st(1)
|
|
.L261:
|
|
fstpl -8(%ebp)
|
|
fldl -8(%ebp)
|
|
leave
|
|
ret
|
|
|
|
*/
|