41 #include "EST_TMatrix.h" 45 #include "EST_matrix_support.h" 46 #include "EST_TVector.h" 47 #include "EST_cutils.h" 48 #include "EST_error.h" 83 T *memory,
int offset,
int free_when_destroyed)
86 set_memory(memory, offset, rows, cols, free_when_destroyed);
103 if (!EST_matrix_bounds_check(row, col, num_rows(), num_columns(), FALSE))
104 return *this->error_return;
106 return a_no_check(row,col);
130 int r_step,
int c_step,
131 int start_r,
int num_r,
132 int start_c,
int num_c
135 for(
int r=start_r, i=0, rp=0; i< num_r; i++, r++, rp+=r_step)
136 for(
int c=start_c, j=0, cp=0; j< num_c; j++, c++, cp+=c_step)
137 a_no_check(r,c) = data[rp+cp];
142 int r_step,
int c_step,
143 int start_r,
int num_r,
144 int start_c,
int num_c
147 for(
int r=start_r, i=0, rp=0; i< num_r; i++, r++, rp+=r_step)
148 for(
int c=start_c, j=0, cp=0; j< num_c; j++, c++, cp+=c_step)
149 data[rp+cp] = a_no_check(r,c);
170 EST_error(
"Can't add rows with differnet number of columns (%d vs %d)",
176 int old_num_rows = num_rows();
177 resize(num_rows()+in.
num_rows(), num_columns(), TRUE);
179 for(
int i=old_num_rows, i1=0; i<num_rows(); i++, i1++)
180 for(
int j=0; j<num_columns(); j++)
191 EST_error(
"Can't add columns with differnet number of rows (%d vs %d)",
197 int old_num_columns = num_columns();
198 resize(num_columns()+in.
num_columns(), num_rows(), TRUE);
200 for(
int i=old_num_columns, i1=0; i<num_columns(); i++, i1++)
201 for(
int j=0; j<num_rows(); j++)
215 if (num_rows() != new_rows || num_columns() != new_cols || this->p_memory == NULL )
217 if (this->p_sub_matrix)
218 EST_error(
"Attempt to resize Sub-Matrix");
220 if (new_cols < 0 || new_rows < 0)
221 EST_error(
"Attempt to resize matrix to negative size: %d x %d",
226 new_m =
new T[new_rows*new_cols];
228 if (this->p_memory != NULL)
230 if (old_vals != NULL)
231 *old_vals = this->p_memory;
232 else if (!this->p_sub_matrix)
233 delete [] (this->p_memory-this->p_offset);
236 p_num_rows = new_rows;
237 this->p_num_columns = new_cols;
239 p_row_step=this->p_num_columns;
240 this->p_column_step=1;
242 this->p_memory = new_m;
245 *old_vals = this->p_memory;
253 T * old_vals = this->p_memory;
254 int old_rows = num_rows();
255 int old_cols = num_columns();
256 int old_row_step = p_row_step;
257 int old_offset = this->p_offset;
258 int old_column_step = this->p_column_step;
265 just_resize(new_rows, new_cols, &old_vals);
272 if (old_vals != NULL)
274 copy_r = Lof(num_rows(), old_rows);
275 copy_c = Lof(num_columns(), old_cols);
278 old_row_step, old_column_step,
288 for(i=0; i<copy_r; i++)
289 for(j=copy_c; j<new_cols; j++)
290 a_no_check(i,j) = *this->def_val;
292 for(i=copy_r; i<new_rows; i++)
293 for(j=0; j<new_cols; j++)
294 a_no_check(i,j) = *this->def_val;
297 if (old_vals && old_vals != this->p_memory && !this->p_sub_matrix)
298 delete [] (old_vals-old_offset);
304 return this->p_offset >= n*p_row_step;
310 return this->p_offset >= n*this->p_column_step;
317 for (i = 0; i < num_rows(); ++i)
318 for (j = 0; j < num_columns(); ++j)
328 if (filename ==
"-" || filename ==
"")
331 outf =
new ofstream(filename);
333 for (i = 0; i < num_rows(); ++i)
335 for (j = 0; j < num_columns(); ++j)
340 <<
",m="<<((int)this->p_memory)<<
"," 341 <<
"r'="<<((int)((T *) mx_move_pointer_f(this->p_memory,
sizeof(T)*p_row_step, i)))<<
"," 342 <<
"r="<<((int)mx_move_pointer(this->p_memory, T, p_row_step, i))<<
"," 343 <<
"c="<<((
int)mx_move_pointer(this->p_memory, T, this->p_column_step, j))<<
"," 344 <<((
int)(&fast_a_m_gcc(i,j)))
347 << a_no_check(i,j) <<
"\t";
365 EST_error(
"Matrix loading not implemented yet.");
366 return misc_read_error;
372 int rows,
int columns,
373 int free_when_destroyed)
377 p_row_step = columns;
382 int offset,
int num)
const 384 int to = num >= 0 ? offset + num : num_columns();
386 if (!EST_matrix_bounds_check(r, 0, num_rows(), num_columns(), FALSE))
394 for (
int j = offset; j < to; j++)
395 buf[j-offset] = fast_a_m(r, j);
400 int offset,
int num)
const 402 int to = num >= 0 ? offset + num : num_columns();
404 if (!EST_matrix_bounds_check(r, 0, num_rows(), num_columns(), FALSE))
414 for (
int j = offset; j < to; j++)
415 buf[j - offset] = fast_a_m(r, j);
421 int offset,
int num)
const 426 int to = num >= 0 ? offset + num : num_rows();
428 if (!EST_matrix_bounds_check(0, c, num_rows(), num_columns(), FALSE))
436 for (
int i = offset; i < to; i++)
437 buf[i-offset] = fast_a_m(i, c);
443 int offset,
int num)
const 448 int to = num >= 0 ? offset + num : num_rows();
450 if (!EST_matrix_bounds_check(0, c, num_rows(), num_columns(), FALSE))
452 if( num_columns()>0 )
460 for (
int i = offset; i < to; i++)
461 buf[i-offset] = fast_a_m(i, c);
468 int to = num>=0?offset+num:num_columns();
470 if (!EST_matrix_bounds_check(r, 0, num_rows(), num_columns(), TRUE))
473 for(
int j=offset; j<to; j++)
474 fast_a_m(r, j) = buf[j-offset];
480 int to = num>=0?offset+num:num_rows();
482 if (!EST_matrix_bounds_check(0, c, num_rows(), num_columns(), TRUE))
485 for(
int i=offset; i<to; i++)
486 fast_a_m(i, c) = buf[i-offset];
494 int to = num>=0?offset+num:num_columns();
496 if (!EST_matrix_bounds_check(r, 0, num_rows(), num_columns(), TRUE))
507 for(
int j=offset; j<to; j++)
508 fast_a_m(r, j) = from.
fast_a_m(from_r, (j-offset)+from_offset);
516 int to = num>=0?offset+num:num_rows();
518 if (!EST_matrix_bounds_check(0, c, num_rows(), num_columns(), TRUE))
529 for(
int i=offset; i<to; i++)
530 fast_a_m(i, c) = from.
fast_a_m((i-offset)+from_offset, from_c);
537 len = num_columns()-start_c;
539 if (!EST_matrix_bounds_check(r, 1, start_c, len, num_rows(), num_columns(), 0))
542 if (rv.
p_memory != NULL && ! rv.p_sub_matrix)
545 rv.p_sub_matrix = TRUE;
547 rv.
p_offset = this->p_offset + start_c*this->p_column_step + r*p_row_step;
552 rv.p_column_step=this->p_column_step;
559 len = num_rows()-start_r;
561 if (!EST_matrix_bounds_check(start_r, len, c, 1,num_rows(), num_columns(), 0))
564 if (cv.
p_memory != NULL && ! cv.p_sub_matrix)
567 cv.p_sub_matrix = TRUE;
569 cv.
p_offset = this->p_offset + c*this->p_column_step + start_r*p_row_step;
574 cv.p_column_step=p_row_step;
579 int r,
int len_r,
int c,
int len_c)
582 len_r = num_rows()-r;
584 len_c = num_columns()-c;
586 if (!EST_matrix_bounds_check(r, len_r, c, len_c, num_rows(), num_columns(), 0))
589 if (sm.
p_memory != NULL && ! sm.p_sub_matrix)
592 sm.p_sub_matrix = TRUE;
593 sm.
p_offset = this->p_offset + c*this->p_column_step + r*p_row_step;
596 sm.p_column_step=this->p_column_step;
void column(EST_TVector< T > &cv, int c, int start_r=0, int len=-1)
Make the vector { cv} a window onto column { c}.
int num_rows() const
return number of rows
void row(EST_TVector< T > &rv, int r, int start_c=0, int len=-1)
Make the vector { rv} a window onto row { r}.
EST_TMatrix & add_rows(const EST_TMatrix &s)
The two versions of what might have been operator +=.
void copy_column(int c, T *buf, int offset=0, int num=-1) const
EST_TMatrix()
default constructor
void set_memory(T *buffer, int offset, int rows, int columns, int free_when_destroyed=0)
void copy(const EST_TMatrix< T > &a)
private resize and copy function.
int num_columns() const
return number of columns
void resize(int rows, int cols, int set=1)
void default_vals()
sets data and length to default values (0 in both cases).
unsigned int p_num_columns
Visible shape.
EST_write_status save(const class EST_String &filename) const
save Matrix to file { filename}
void copy_data(const EST_TMatrix< T > &a)
just copy data, no resizing, no size check.
void resize(int n, int set=1)
unsigned int p_offset
How to access the memory.
void just_resize(int new_rows, int new_cols, T **old_vals)
resize the memory and reset the bounds, but don't set values.
void default_vals()
sets data and length to default values (0 in both cases).
unsigned int p_row_step
How to access the memory.
EST_read_status load(const class EST_String &filename)
load Matrix from file - Not currently implemented.
INLINE const T & fast_a_m(int r, int c) const
quick method for returning { x[m][n]}
~EST_TMatrix()
EST_TMatrix.
void sub_matrix(EST_TMatrix< T > &sm, int r=0, int numr=EST_ALL, int c=0, int numc=EST_ALL)
Make the matrix { sm} a window into this matrix.
unsigned int p_num_rows
Visible shape.
void set_values(const T *data, int r_step, int c_step, int start_r, int num_r, int start_c, int num_c)
Get and set values from array.
EST_TMatrix & operator=(const EST_TMatrix &s)
assignment operator
void copy_row(int r, T *buf, int offset=0, int num=-1) const
void set_row(int n, const T *buf, int offset=0, int num=-1)
void set_column(int n, const T *buf, int offset=0, int num=-1)
const T & a_check(int row, int col) const
const element access function