File: complex_matrix.h

package info (click to toggle)
phast 1.4%2Bdfsg-1
  • links: PTS, VCS
  • area: main
  • in suites: buster
  • size: 12,412 kB
  • sloc: ansic: 54,180; makefile: 354; sh: 337; perl: 321
file content (231 lines) | stat: -rw-r--r-- 7,983 bytes parent folder | download | duplicates (2)
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
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
/***************************************************************************
 * PHAST: PHylogenetic Analysis with Space/Time models
 * Copyright (c) 2002-2005 University of California, 2006-2010 Cornell 
 * University.  All rights reserved.
 *
 * This source code is distributed under a BSD-style license.  See the
 * file LICENSE.txt for details.
 ***************************************************************************/

/** @file complex_matrix.h
    Matrices of complex numbers
    @ingroup base
*/

#ifndef ZMAT_H
#define ZMAT_H

#include <complex.h>
#include <complex_vector.h>
#include <external_libs.h>

/** Structure for matrix of complex numbers -- 2d array of Complex
    objects and its dimensions */
typedef struct {
  Complex **data;  /**< Contains matrix data as complex numbers*/
  int nrows;    /**< Number of rows */
  int ncols;   /**< Number of columns */
} Zmatrix;

/** \name Complex Matrix allocation functions 
 \{ */

/** Create a new matrix of nrows * ncols containing complex numbers
  @param nrows Number of rows in new matrix
  @param ncols Number of columns in new matrix
  @result Newly created Zmatrix of size nrows * ncols
*/
Zmatrix *zmat_new(int nrows, int ncols);

/** \name Complex Matrix cleanup functions 
 \{ */


/** Free a Zmatrix
   @param m Zmatrix to free  */
void zmat_free(Zmatrix *m);

/** \name Complex Matrix data access functions 
 \{ */

/* we'll only inline the functions likely to be used heavily in inner
   loops */  

/** Get a single complex number from matrix.
    @param m Matrix containing element to get
    @param row Row within Matrix containing element to get
    @param col Column within Matrix containing element to get
    @result Complex number specified by row & column within matrix
    */
static PHAST_INLINE
Complex zmat_get(Zmatrix *m, int row, int col) {
  return m->data[row][col];
}

/** Set a single complex number in matrix.
    @param m Matrix containing element to set
    @param row Row within matrix containing element to set
    @param col Column within matrix containing element to set
    @param val Value to set element of matrix to (identified by row & column)
 */
static PHAST_INLINE
void zmat_set(Zmatrix *m, int row, int col, Complex val) {
  m->data[row][col] = val;
}

/** Get a single row of complex numbers from a matrix.
  @param m Matrix to get data from
  @param row The row in matrix m to get data from 
  @result Vector containing data for specified row of matrix
*/
Zvector *zmat_get_row(Zmatrix *m, int row);

/** Get a single column of complex numbers from a matrix.
  @param m Matrix to get data from
  @param col Column in matrix m to get data from
  @result Vector containing data from specified column of matrix
*/
Zvector *zmat_get_col(Zmatrix *m, int col);

/** \name Complex Matrix modification functions 
 \{ */

/** Transform specified matrix into identity matrix.
    @param m Matrix to transform into identity matrix
 */
void zmat_set_identity(Zmatrix *m);

/** Set all elements in a matrix to zero.
    @param m Matrix to zero out
 */
void zmat_zero(Zmatrix *m);

/** Set all elements in a matrix to a single value
    @param m Matrix to modify
    @param val New value for every element in matrix
 */
void zmat_set_all(Zmatrix *m, Complex val);


/** Multiply all elements in matrix m by a complex scale_factor.
    @param m Matrix to multiply
    @param scale_factor Amount each element in matrix m should be multiplied by
    @note For real number scale version see zmat_scale()
    @see zmat_scale
 */
void zmat_scale_complex(Zmatrix *m, Complex scale_factor);

/** Multiply all elements in matrix m by a scale_factor of type double. 
    @param m Matrix to multiply
    @param scale_factor Amount each element in matrix m should be multiplied by
    @note For complex number scale version see zmat_scale()
    @see zmat_scale_complex
*/
void zmat_scale(Zmatrix *m, double scale_factor);

/** Matrix multiplication.
  @param[out] prod Result of matrix multiplication
  @param[in] m1 Matrix to multiply by m2
  @param[in] m2 Matrix to be multiplied by m1
  @warning Matrix prod will be overwritten with result
*/
void zmat_mult(Zmatrix *prod, Zmatrix *m1, Zmatrix *m2);

/** Matrix vector multiplication.
  @param[out] prod Result of matrix vector multiplication
  @param[in] m Matrix to be multiplied by v
  @param[in] v Vector to multiply matrix m by
  @warning Matrix prod will be overwritten with result
*/
void zmat_vec_mult(Zvector *prod, Zmatrix *m, Zvector *v);

/** Matrix Multiply complex matrices where result are expected to be real
  @param[out] prod result of matrix multiplication
  @param m1 complex matrix to multiply by m2
  @param m2 complex matrix to be multiplied by m1
  @warning the matrix prod will be overwritten
  @note the results matrix is expected to have real number results
*/
void zmat_mult_real(Matrix *prod, Zmatrix *m1, Zmatrix *m2);

/** Matrix Add.
  For each element [x,y] in thism add element [x,y] from addm. 
  param thism[in,out] Matrix that contains the element to add to
  param addm[in] Matrix that specifies how much to add to each element of thism
*/
void zmat_plus_eq(Zmatrix *thism, Zmatrix *addm);

/** Matrix Subtract.
  For each element[x,y] in thism, subtract element from subm at [x,y].
  param thism[in,out] Matrix that contains the element to subtract from
  param subm[in] Matrix that specifies how much to subtract from each element of thism
*/
void zmat_minus_eq(Zmatrix *thism, Zmatrix *subm);
/** Compute A = B * C * D where A, B, C, D are square matrices of the
   same dimension, and C is diagonal.  Allow B, C, D to be complex
   valued but assume their product is real valued (as when B,C,D
   represent diagonalization of A).  C is described by a vector
   representing its diagonal elements.  A temporary matrix can optionally
   be passed in to improve efficiency. 
   @param A Result matrix
   @param B First matrix in multiplication
   @param C Diagonal matrix represented by a vector
   @param D Last matrix in multiplication
   @param scratch (Optional) Improve efficiency by allocating scratch memory beforehand
 */
void zmat_mult_real_diag(Matrix *A, Zmatrix *B, Zvector *C, Zmatrix *D,
                         Zmatrix *scratch);

/** \name Complex Matrix copy functions 
 \{ */

/** Copy all data from one matrix 'src' to another 'dest'.
    @param src Matrix with data to copy from
    @param dest Matrix to copy data to
 */
void zmat_copy(Zmatrix *dest, Zmatrix *src);

/** Create a copy of all data from matrix 'src'.
    @param src Matrix to clone
    @result Clone of matrix specified in src
 */
Zmatrix *zmat_create_copy(Zmatrix *src);

/** \name Complex Matrix read/save as file functions 
 \{ */

/** Save a Matrix to file.
    @param m Matrix to save to file
    @param F File to save matrix in
 */
void zmat_print(Zmatrix *m, FILE *F);

/** Read a Matrix from a file into an existing matrix object. 
  @pre Matrix m must have defined the number of rows and columns
  @param Allocated Matrix object
  @param F file descriptor of file containing matrix data
*/
void zmat_read(Zmatrix *m, FILE *F);

/** Create a Matrix from matrix data in a file 
  @param F File descriptor of file containing matrix data
  @param nrows Number of rows allocated for new matrix
  @param ncols Number of columns allocated for new matrix
  @result Newly created z-matrix populated by data from file
*/
Zmatrix *zmat_new_from_file(FILE *F, int nrows, int ncols);

/** \name Complex Matrix cast functions 
 \{ */

/** "Cast" complex matrix as real, (extract real component of each element).
   @param[out] dest Result Matrix of real numbers
   @param[in] src Complex number matrix containing data we will "cast"
   @param[in] strict Ensure imaginary components are very close to zero, otherwise die
   @result 0 == Success, 1 == Failure (at least one element had an imaginary component that was not very close to zero)
*/
int zmat_as_real(Matrix *dest, Zmatrix *src, int strict);

/** \} */

#endif