|
DenseLinAlgPack: Concreate C++ Classes for Dense Blas-Compatible Linear Algebra Version of the Day
|
00001 // @HEADER 00002 // *********************************************************************** 00003 // 00004 // Moocho: Multi-functional Object-Oriented arCHitecture for Optimization 00005 // Copyright (2003) Sandia Corporation 00006 // 00007 // Under terms of Contract DE-AC04-94AL85000, there is a non-exclusive 00008 // license for use of this work by or on behalf of the U.S. Government. 00009 // 00010 // This library is free software; you can redistribute it and/or modify 00011 // it under the terms of the GNU Lesser General Public License as 00012 // published by the Free Software Foundation; either version 2.1 of the 00013 // License, or (at your option) any later version. 00014 // 00015 // This library is distributed in the hope that it will be useful, but 00016 // WITHOUT ANY WARRANTY; without even the implied warranty of 00017 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 00018 // Lesser General Public License for more details. 00019 // 00020 // You should have received a copy of the GNU Lesser General Public 00021 // License along with this library; if not, write to the Free Software 00022 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 00023 // USA 00024 // Questions? Contact Roscoe A. Bartlett (rabartl@sandia.gov) 00025 // 00026 // *********************************************************************** 00027 // @HEADER 00028 00029 #include <assert.h> 00030 00031 #include "DenseLinAlgPack_delete_row_col.hpp" 00032 #include "DenseLinAlgPack_DMatrixClass.hpp" 00033 #include "DenseLinAlgPack_DMatrixAsTriSym.hpp" 00034 00035 void DenseLinAlgPack::delete_row_col( size_type kd, DMatrixSliceTriEle* tri_M ) 00036 { 00037 // Validate input 00038 TEST_FOR_EXCEPT( !( tri_M ) ); 00039 TEST_FOR_EXCEPT( !( tri_M->rows() ) ); 00040 TEST_FOR_EXCEPT( !( 1 <= kd && kd <= tri_M->rows() ) ); 00041 00042 DMatrixSlice M = tri_M->gms(); 00043 const size_type n = M.rows(); 00044 00045 if( tri_M->uplo() == BLAS_Cpp::lower ) { 00046 // Move M31 up one row at a time 00047 if( 1 < kd && kd < n ) { 00048 Range1D rng(1,kd-1); 00049 for( size_type i = kd; i < n; ++i ) 00050 M.row(i)(rng) = M.row(i+1)(rng); 00051 } 00052 // Move M33 up and to the left one column at a time 00053 if( kd < n ) { 00054 for( size_type i = kd; i < n; ++i ) 00055 M.col(i)(i,n-1) = M.col(i+1)(i+1,n); 00056 } 00057 } 00058 else if( tri_M->uplo() == BLAS_Cpp::upper ) { 00059 // Move M13 left one column at a time. 00060 if( 1 < kd && kd < n ) { 00061 Range1D rng(1,kd-1); 00062 for( size_type j = kd; j < n; ++j ) 00063 M.col(j)(rng) = M.col(j+1)(rng); 00064 } 00065 // Move the updated U33 up and left one column at a time. 00066 if( kd < n ) { 00067 for( size_type j = kd; j < n; ++j ) 00068 M.col(j)(kd,j) = M.col(j+1)(kd+1,j+1); 00069 } 00070 } 00071 else { 00072 TEST_FOR_EXCEPT(true); // Invalid input 00073 } 00074 }
1.7.4