From 834fd69e87b0a137c88fadd443a7c5b025b2d1af Mon Sep 17 00:00:00 2001
From: Elian Dib <elian.dib@inria.fr>
Date: Thu, 25 Apr 2019 19:56:37 +0200
Subject: [PATCH] Added factorization

---
 factorize.m | 14 ++++++++++++++
 svd_nsq.m   | 28 ++++++++++++++++++++++++++++
 2 files changed, 42 insertions(+)
 create mode 100644 factorize.m
 create mode 100644 svd_nsq.m

diff --git a/factorize.m b/factorize.m
new file mode 100644
index 0000000..ee801cd
--- /dev/null
+++ b/factorize.m
@@ -0,0 +1,14 @@
+function [B,C,U,S,V] = factorize(M,k)
+%FACTORIZE Summary of this function goes here
+%   Detailed explanation goes here
+
+Mask = isnan(M);
+M(Mask) = 0;
+
+[U,S,V] = utils.svd_nsq(M);
+B = U(:,1:k)*S(1:k,1:k);
+C = V(:,1:k)';
+
+B(any(Mask,2),:) = nan;
+
+end
\ No newline at end of file
diff --git a/svd_nsq.m b/svd_nsq.m
new file mode 100644
index 0000000..f7521ce
--- /dev/null
+++ b/svd_nsq.m
@@ -0,0 +1,28 @@
+function [U,S,V] = svd_nsq(Z)
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%               SVD accelerated for non-square matrices
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+[m, n] = size(Z);
+
+if 2*m < n
+    ZZT = Z*Z';
+    [U, S2, Ua] = svd(ZZT);
+    S = sqrt(S2);
+    Sinv = diag(1./diag(S));
+    V = Z' * U * Sinv;
+    return;
+end
+if m > 2*n
+    ZTZ = Z'*Z;
+    [Va, S2, V] = svd(ZTZ);
+    S = sqrt(S2);
+    Sinv = diag(1./diag(S));
+    U = Z * V * Sinv;
+    return;
+end
+
+if(m==n)
+    [U,S,V] = svd(Z);
+else
+    [U,S,V] = svd(Z,'econ');
+end
\ No newline at end of file
-- 
GitLab