4 #ifndef DUNE_FMATRIX_HH
5 #define DUNE_FMATRIX_HH
32 template<
class K,
int ROWS,
int COLS >
class FieldMatrix;
34 template<
class K,
int ROWS,
int COLS >
50 template<
class K,
int ROWS,
int COLS >
65 template<
class K,
int ROWS,
int COLS>
101 DenseMatrixAssigner<Conversion<T,K>::exists>::assign(*
this, t);
105 using Base::operator=;
118 (*
this)[i][j] += M[i][k]*C[k][j];
135 C[i][j] += M[i][k]*(*
this)[k][j];
150 (*
this)[i][j] += C[i][k]*M[k][j];
165 C[i][j] += (*
this)[i][k]*M[k][j];
188 #ifndef DOXYGEN // hide specialization
192 class FieldMatrix<K,1,1> :
public DenseMatrix< FieldMatrix<K,1,1> >
194 FieldVector<K,1> _data;
195 typedef DenseMatrix< FieldMatrix<K,1,1> > Base;
240 DenseMatrixAssigner<Conversion<T,K>::exists>::assign(*
this, t);
249 FieldMatrix<K,l,1> C;
251 C[j][0] = M[j][0]*(*
this)[0][0];
266 FieldMatrix<K,1,l> C;
269 C[0][j] = M[0][j]*_data[0];
319 operator K ()
const {
return _data[0]; }
325 std::ostream& operator<< (std::ostream& s, const FieldMatrix<K,1,1>& a)
333 namespace FMatrixHelp {
336 template <
typename K>
339 inverse[0][0] = 1.0/matrix[0][0];
344 template <
typename K>
352 template <
typename K>
356 K det = (matrix[0][0]*matrix[1][1] - matrix[0][1]*matrix[1][0]);
358 inverse[0][0] = matrix[1][1] * det_1;
359 inverse[0][1] = - matrix[0][1] * det_1;
360 inverse[1][0] = - matrix[1][0] * det_1;
361 inverse[1][1] = matrix[0][0] * det_1;
367 template <
typename K>
371 K det = (matrix[0][0]*matrix[1][1] - matrix[0][1]*matrix[1][0]);
373 inverse[0][0] = matrix[1][1] * det_1;
374 inverse[1][0] = - matrix[0][1] * det_1;
375 inverse[0][1] = - matrix[1][0] * det_1;
376 inverse[1][1] = matrix[0][0] * det_1;
381 template <
typename K>
385 K t4 = matrix[0][0] * matrix[1][1];
386 K t6 = matrix[0][0] * matrix[1][2];
387 K t8 = matrix[0][1] * matrix[1][0];
388 K t10 = matrix[0][2] * matrix[1][0];
389 K t12 = matrix[0][1] * matrix[2][0];
390 K t14 = matrix[0][2] * matrix[2][0];
392 K det = (t4*matrix[2][2]-t6*matrix[2][1]-t8*matrix[2][2]+
393 t10*matrix[2][1]+t12*matrix[1][2]-t14*matrix[1][1]);
396 inverse[0][0] = (matrix[1][1] * matrix[2][2] - matrix[1][2] * matrix[2][1])*t17;
397 inverse[0][1] = -(matrix[0][1] * matrix[2][2] - matrix[0][2] * matrix[2][1])*t17;
398 inverse[0][2] = (matrix[0][1] * matrix[1][2] - matrix[0][2] * matrix[1][1])*t17;
399 inverse[1][0] = -(matrix[1][0] * matrix[2][2] - matrix[1][2] * matrix[2][0])*t17;
400 inverse[1][1] = (matrix[0][0] * matrix[2][2] - t14) * t17;
401 inverse[1][2] = -(t6-t10) * t17;
402 inverse[2][0] = (matrix[1][0] * matrix[2][1] - matrix[1][1] * matrix[2][0]) * t17;
403 inverse[2][1] = -(matrix[0][0] * matrix[2][1] - t12) * t17;
404 inverse[2][2] = (t4-t8) * t17;
410 template <
typename K>
414 K t4 = matrix[0][0] * matrix[1][1];
415 K t6 = matrix[0][0] * matrix[1][2];
416 K t8 = matrix[0][1] * matrix[1][0];
417 K t10 = matrix[0][2] * matrix[1][0];
418 K t12 = matrix[0][1] * matrix[2][0];
419 K t14 = matrix[0][2] * matrix[2][0];
421 K det = (t4*matrix[2][2]-t6*matrix[2][1]-t8*matrix[2][2]+
422 t10*matrix[2][1]+t12*matrix[1][2]-t14*matrix[1][1]);
425 inverse[0][0] = (matrix[1][1] * matrix[2][2] - matrix[1][2] * matrix[2][1])*t17;
426 inverse[1][0] = -(matrix[0][1] * matrix[2][2] - matrix[0][2] * matrix[2][1])*t17;
427 inverse[2][0] = (matrix[0][1] * matrix[1][2] - matrix[0][2] * matrix[1][1])*t17;
428 inverse[0][1] = -(matrix[1][0] * matrix[2][2] - matrix[1][2] * matrix[2][0])*t17;
429 inverse[1][1] = (matrix[0][0] * matrix[2][2] - t14) * t17;
430 inverse[2][1] = -(t6-t10) * t17;
431 inverse[0][2] = (matrix[1][0] * matrix[2][1] - matrix[1][1] * matrix[2][0]) * t17;
432 inverse[1][2] = -(matrix[0][0] * matrix[2][1] - t12) * t17;
433 inverse[2][2] = (t4-t8) * t17;
439 template<
class K,
int m,
int n,
int p >
446 for( size_type i = 0; i < m; ++i )
448 for( size_type j = 0; j < p; ++j )
450 ret[ i ][ j ] = K( 0 );
451 for( size_type k = 0; k < n; ++k )
452 ret[ i ][ j ] += A[ i ][ k ] * B[ k ][ j ];
458 template <
typename K,
int rows,
int cols>
463 for(size_type i=0; i<cols; i++)
464 for(size_type j=0; j<cols; j++)
467 for(size_type k=0; k<rows; k++)
468 ret[i][j]+=matrix[k][i]*matrix[k][j];
474 template <
typename K,
int rows,
int cols>
479 for(size_type i=0; i<rows; ++i)
482 for(size_type j=0; j<cols; ++j)
484 ret[i] += matrix[i][j]*x[j];
493 template <
typename K,
int rows,
int cols>
498 for(size_type i=0; i<cols; ++i)
501 for(size_type j=0; j<rows; ++j)
502 ret[i] += matrix[j][i]*x[j];
507 template <
typename K,
int rows,
int cols>
516 template <
typename K,
int rows,
int cols>