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