2 matrix-storage.cc -- implement Matrix_storage
4 source file of the Flower Library
6 (c) 1997 Han-Wen Nienhuys <hanwen@stack.nl>
9 #include "full-storage.hh"
10 #include "diagonal-storage.hh"
13 Matrix_storage::set_addition_result(Matrix_storage *&dat, Matrix_storage *right)
15 if (dat && dat->name() == Diagonal_storage::static_name()
16 && right->name() == Diagonal_storage::static_name()) {
17 Diagonal_storage *L = (Diagonal_storage*)dat;
18 Diagonal_storage* R = (Diagonal_storage*) right;
20 if ( R->band_size_i() > L->band_size_i()) {
21 L->set_band_size(R->band_size_i());
25 if (!dat || !dat->is_type_b(Full_storage::static_name() )) {
27 Matrix_storage *new_stor = (dat)? new Full_storage(dat) :
28 new Full_storage( right->rows(), right->cols());
35 Matrix_storage::get_product_result(Matrix_storage*left, Matrix_storage*right)
37 Matrix_storage* dest =0;
38 set_product_result(dest, left,right);
47 Matrix_storage::set_product_result(Matrix_storage*&dest,
48 Matrix_storage*left, Matrix_storage*right)
50 if ( left->name() == Diagonal_storage::static_name()
51 && right->name() == Diagonal_storage::static_name()) {
52 Diagonal_storage *L = (Diagonal_storage*)left;
53 Diagonal_storage* R = (Diagonal_storage*) right;
55 if (L->band_size_i() + R->band_size_i() < L->dim()/2 ) {
56 if (dest ->name() != Diagonal_storage::static_name()){
58 dest = new Diagonal_storage;
61 dest->set_size(L->dim());
66 if ( dest && dest->name() == Full_storage::static_name()) {
67 dest->set_size(left->rows(), right->cols());
70 dest = new Full_storage( left->rows(), right->cols());
74 IMPLEMENT_IS_TYPE_B(Matrix_storage);
77 Matrix_storage::get_full(int n, int m)
79 return new Full_storage(n,m);
85 Matrix_storage::try_right_multiply(Matrix_storage *,
86 const Matrix_storage *)const
92 Matrix_storage::row(int n) const
95 for (int j = 0; j < cols(); j++)
101 Matrix_storage::column(int n) const
104 for (int i = 0; i < rows(); i++)
110 Matrix_storage::set_size(int rows, int cols)
117 Matrix_storage::set_size(int rows)
125 Matrix_storage::set_band(Matrix_storage *&mat, int b)
127 Matrix_storage* ns = new Diagonal_storage(mat, b);
134 Matrix_storage::set_full(Matrix_storage *&mat)
136 Matrix_storage* ns = new Full_storage(mat);