File: fff_matrix.h

package info (click to toggle)
nipy 0.1.2%2B20100526-2
  • links: PTS, VCS
  • area: main
  • in suites: squeeze
  • size: 11,992 kB
  • ctags: 13,434
  • sloc: python: 47,720; ansic: 41,334; makefile: 197
file content (98 lines) | stat: -rw-r--r-- 2,980 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
/*!
  \file fff_matrix.h
  \brief fff matrix object 
  \author Alexis Roche
  \date 2003-2008

*/

#ifndef FFF_MATRIX
#define FFF_MATRIX
 
#ifdef __cplusplus
extern "C" {
#endif

#include "fff_vector.h"
#include <stddef.h>


  /*!
    \struct fff_matrix
    \brief The fff matrix structure
  */
  typedef struct {
    size_t size1; 
    size_t size2;
    size_t tda; 
    double* data; 
    int owner; 
  } fff_matrix;
  
  /*! 
    \brief fff matrix constructor
    \param size1 number of rows
    \param size2 number of columns
  */ 
  extern fff_matrix* fff_matrix_new( size_t size1, size_t size2 ); 
  /*! 
    \brief fff matrix destructor
    \param thisone instance to delete
  */ 
  extern void fff_matrix_delete( fff_matrix* thisone ); 

  extern double fff_matrix_get (const fff_matrix * A, size_t i, size_t j);
  extern void fff_matrix_set (fff_matrix * A, size_t i, size_t j, double a);
  extern void fff_matrix_set_all (fff_matrix * A, double a); 
  
  /*!
    \brief Set all diagonal elements to \a a, others to zero 
  */ 
  extern void fff_matrix_set_scalar (fff_matrix * A, double a); 
  
  extern void fff_matrix_scale (fff_matrix * A, double a); 
  extern void fff_matrix_add_constant (fff_matrix * A, double a); 

  /**
     NOT TESTED! 
   **/
  extern long double fff_matrix_sum(const fff_matrix* A); 

  /*** Views ***/ 
  extern fff_matrix fff_matrix_view(const double* data, size_t size1, size_t size2, size_t tda); 
  extern fff_vector fff_matrix_row(const fff_matrix* A, size_t i); 
  extern fff_vector fff_matrix_col(const fff_matrix* A, size_t j);
  extern fff_vector fff_matrix_diag(const fff_matrix* A);  
  extern fff_matrix fff_matrix_block(const fff_matrix* A, 
				     size_t imin, size_t nrows, 
				     size_t jmin, size_t ncols ); 

  extern void fff_matrix_get_row (fff_vector * x, const fff_matrix * A, size_t i);
  extern void fff_matrix_get_col (fff_vector * x, const fff_matrix * A, size_t j) ;
  extern void fff_matrix_get_diag (fff_vector * x, const fff_matrix * A); 
  extern void fff_matrix_set_row (fff_matrix * A, size_t i, const fff_vector * x);
  extern void fff_matrix_set_col (fff_matrix * A, size_t j, const fff_vector * x);
  extern void fff_matrix_set_diag (fff_matrix * A, const fff_vector * x); 

  extern void fff_matrix_memcpy (fff_matrix * A, const fff_matrix * B); 

  /*!
    \brief transpose a matrix
    \param B input matrix
    \param A transposed matrix on exit
    
    The matrix \c A needs be pre-allocated consistently with \c B, so
    that \c A->size1==B->size2 and \c A->size2==B->size1.
  */
  extern void fff_matrix_transpose( fff_matrix* A, const fff_matrix* B ); 

  extern void fff_matrix_add (fff_matrix * A, const fff_matrix * B);
  extern void fff_matrix_sub (fff_matrix * A, const fff_matrix * B); 
  extern void fff_matrix_mul_elements (fff_matrix * A, const fff_matrix * B);
  extern void fff_matrix_div_elements (fff_matrix * A, const fff_matrix * B);

#ifdef __cplusplus
}
#endif
 
#endif