0001 function x = pinv_sol(A,b,method)
0002
0003
0004
0005
0006
0007
0008
0009
0010 if nargin < 3
0011 method = 1;
0012 end
0013
0014 switch(method)
0015 case 1
0016
0017
0018
0019 if isempty(A)
0020 x = [];
0021 return
0022 end
0023
0024 [Q1,R1,E] = qr(A',0);
0025
0026
0027 tol = max(size(A))*10*eps*abs(R1(1,1));
0028
0029 r = sum(abs(diag(R1))>tol);
0030
0031 x = Q1(:,1:r)*(R1(1:r,:)'\b(E));
0032 case 2
0033
0034
0035
0036 x = pinv(A) * b;
0037 case 3
0038
0039
0040
0041
0042 [n,m] = size(A);
0043 if n > m
0044
0045 [U,S,V] = svd(A,0);
0046 else
0047
0048 [V,S,U] = svd(A',0);
0049 end
0050 s = diag(S);
0051 r = sum(s > .0000001);
0052 Sr_pinv = diag(1./s(1:r));
0053 x = V(:,1:r)*Sr_pinv*U(:,1:r)'*b;
0054 end