$include_dir="/home/hyper-archives/ublas/include"; include("$include_dir/msg-header.inc") ?>
From: Gunter Winkler (guwi17_at_[hidden])
Date: 2007-01-21 14:17:56
Paul C. Leopardi schrieb:
> Hi all,
> Is the worst case time complexity of ublas::compressed_matrix operations 
> documented anywhere? For addition of square matrices where each of the 
> operands is half full with no non-zeros in common, using operator+=
> >from Boost 1.33.0 and 1.33.1, I'm getting about O(dim^2) for ublas::matrix and 
> about O(nnz * dim^2) for ublas::compressed_matrix. Is this what should be 
> expected in this case? Is it the worst case? 
>   
The worst case for a compressed matrix is to insert elements from last 
(n,m) to first (0,0) because you essentiallialy insert a new element 
into an array. This means (1) realloc if necessary (in armotized 
constant time) (2) shift all elements one position forward (in linear 
time O(nnz)) (3) insert the new data at position 0. For this operation 
you should use a different storage scheme:
coordinate_matrix: += means appending elements to an array (you need 
more memory later need a sort/compress operation in O(nnz (1 + log(nnz)))).
generalized_vector_of_vector with compressed vectors: element lookup is 
O(log(nnz per row)) and worst case insert is O(nnz per row), average 
should be O(log(nnz per row))
generalized_vector_of_vector with coordinate vectors: += (aka 
v.append_element(k,x) ) is O(1) + final sort.
I use the second one for my finite element assembly.
btw:  the construction of a compressed_matrix from a coordinate matrix 
is a O(nnz) operation. This could even be done inplace (but this is not 
implemented, because I have no idea how to do this without too much ugly 
tricks.). Please have a look at the constructors of compressed_matrix. 
(I even have a near optimal implementation of 
compressed_matrix.assign_temporary(coordinate_matrix) in my files.)
mfg
Gunter