rbmatlab  1.16.09
 All Classes Namespaces Files Functions Variables Modules Pages
svds_batch.m
1 function [U,s] = svds_batch(X,k_per_part,n_parts)
2 %function [U,s] = svds_batch(X,k_per_part,n_parts)
3 %
4 % function computing k_per_part * n_parts POD modes of
5 % the matrix X and singular values in vector s
6 % function can be used if svds(X,k_per_part*n_parts) gives
7 % memory problem.
8 %
9 % exact orthogonality is not obtained and some zero vectors can be returned!
10 
11 % Bernard Haasdonk 29.5.2010
12 
13 k = k_per_part*n_parts;
14 U = zeros(size(X,1),k);
15 s = zeros(k,1);
16 n = size(X,2);
17 
18 if (k>n)
19  error('too many modes requested.');
20 end;
21 
22 part_start_index = floor((0:n_parts)*(k/n_parts))+1;
23 found_zero_vector = 0;
24 for p = 1:n_parts
25  if ~found_zero_vector
26  ind = part_start_index(p):(part_start_index(p+1)-1);
27  disp(['computing mode ',num2str(ind(end)),'...']);
28  % keyboard;
29  [Unew,S] = svds(X,k_per_part);
30  ind2 = ind(1:size(Unew,2));
31  U(:,ind2) = Unew;
32  s(ind2) = diag(S);
33  disp(['orthogonalization ...']);
34  % orthonormalization:
35  X = X - U(:,1:ind(end))*(U(:,1:ind(end))'*X);
36  if ~isequal(ind,ind2)
37  found_zero_vector = 1;
38  end;
39  end;
40 end;
41 %disp(['orthonormaization with qr ...']);
42 %U = orthonormalize_qr(U);
43 disp(['svds_batch finished ']);
44 
45