From cec1b7921c9e31f646f305a2700c442eef834a11 Mon Sep 17 00:00:00 2001
From: sebastien <sebastien@ac1d8469-bf42-47a9-8791-bf33cf982152>
Date: Mon, 27 Oct 2008 14:46:42 +0000
Subject: [PATCH] 4.0: merged r2122,2137,2141,2149 changesets (fixed bug in
 filter and smoother in the presence of unobserved stochastic trends)

git-svn-id: https://www.dynare.org/svn/dynare/branches/4.0@2211 ac1d8469-bf42-47a9-8791-bf33cf982152
---
 matlab/DsgeLikelihood.m | 10 ++++++----
 matlab/DsgeSmoother.m   | 17 +++++++++--------
 2 files changed, 15 insertions(+), 12 deletions(-)

diff --git a/matlab/DsgeLikelihood.m b/matlab/DsgeLikelihood.m
index bc35a43bfd..5c2940d23a 100644
--- a/matlab/DsgeLikelihood.m
+++ b/matlab/DsgeLikelihood.m
@@ -241,15 +241,17 @@ function [fval,cost_flag,ys,trend_coeff,info] = DsgeLikelihood(xparam1,gend,data
       
       Z = QT(mf,:);
       R1 = QT'*R;
-      [u,s,v]=svd(Z*ST(:,1:nk),0);
-      k = find(abs(diag(s)) < 1e-8);
+%      [u,s,v]=svd(Z*ST(:,1:nk),0);
+      [QQ,RR,EE] = qr(Z*ST(:,1:nk),0);
+      k = find(abs(diag(RR)) < 1e-8);
       if length(k) > 0
-	  [junk,k1] = max(abs(v(:,k)));
+          k1 = EE(:,k);
+%	  [junk,k1] = max(abs(v(:,k)));
 	  dd =ones(nk,1);
 	  dd(k1) = zeros(length(k1),1);
 	  Pinf(1:nk,1:nk) = diag(dd);
       end
-	
+
   end
   %------------------------------------------------------------------------------
   % 4. Likelihood evaluation
diff --git a/matlab/DsgeSmoother.m b/matlab/DsgeSmoother.m
index 7a07d715f5..cc8b050ff7 100644
--- a/matlab/DsgeSmoother.m
+++ b/matlab/DsgeSmoother.m
@@ -175,14 +175,15 @@ function [alphahat,etahat,epsilonhat,ahat,SteadyState,trend_coeff,aK,T,R,P,PK,d,
       
       Z = QT(mf,:);
       R1 = QT'*R;
-      [u,s,v]=svd(Z*ST(:,1:nk),0);
-      k = find(abs(diag(s)) < 1e-8);
-      if length(k) > 0
-	  [junk,k1] = max(abs(v(:,k)));
-	  dd =ones(nk,1);
-	  dd(k1) = zeros(length(k1),1);
-	  Pinf(1:nk,1:nk) = diag(dd);
-      end
+% $$$       [u,s,v]=svd(Z*ST(:,1:nk),0);
+% $$$       k = find(abs(diag(s)) < 1e-8);
+% $$$       if length(k) > 0
+% $$$ 	  [junk,k1] = max(abs(v(:,k)));
+% $$$ 	  dd =ones(nk,1);
+% $$$ 	  dd(k1) = zeros(length(k1),1);
+% $$$ 	  Pinf(1:nk,1:nk) = diag(dd);
+% $$$       end
+      Pinf(1:nk,1:nk) = eye(nk);
   end
   % -----------------------------------------------------------------------------
   %  4. Kalman smoother
-- 
GitLab