rbmatlab 0.10.01
|
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