rbmatlab 0.10.01
general/vecmat/svds_batch.m
00001 function [U,s] = svds_batch(X,k_per_part,n_parts)
00002 %function [U,s] = svds_batch(X,k_per_part,n_parts)
00003 %
00004 % function computing k_per_part * n_parts POD modes of
00005 % the matrix X and singular values in vector s
00006 % function can be used if svds(X,k_per_part*n_parts) gives 
00007 % memory problem. 
00008 %
00009 % exact orthogonality is not obtained and some zero vectors can be returned!
00010 
00011 % Bernard Haasdonk 29.5.2010
00012 
00013 k = k_per_part*n_parts;
00014 U = zeros(size(X,1),k);
00015 s = zeros(k,1);
00016 n = size(X,2);
00017 
00018 if (k>n)
00019   error('too many modes requested.');
00020 end;
00021 
00022 part_start_index = floor((0:n_parts)*(k/n_parts))+1;
00023 found_zero_vector = 0;
00024 for p = 1:n_parts
00025   if ~found_zero_vector
00026     ind = part_start_index(p):(part_start_index(p+1)-1);
00027     disp(['computing mode ',num2str(ind(end)),'...']);
00028     %  keyboard;
00029     [Unew,S] = svds(X,k_per_part);
00030     ind2 = ind(1:size(Unew,2));
00031     U(:,ind2) = Unew;
00032     s(ind2) = diag(S);
00033     disp(['orthogonalization ...']);
00034     % orthonormalization:
00035     X = X - U(:,1:ind(end))*(U(:,1:ind(end))'*X);
00036     if ~isequal(ind,ind2)
00037       found_zero_vector = 1;
00038     end;
00039   end;    
00040 end;
00041 %disp(['orthonormaization with qr ...']);
00042 %U = orthonormalize_qr(U);
00043 disp(['svds_batch finished ']);
00044 
00045 
All Classes Namespaces Files Functions Variables