function [L,M,R, err] = GLRAM(A, L, low1, low2, ITE)
%------------------------------------------------------------------
% Input A: data matrix
% L: initial L0
% low1: row dimension of reduced representation M{i}
% low2: column dimension of reduced representation M{i}
% ITE: number of iterations
% Output: L: left transformation
% M: reduced representation
% R: right transformation
% err: reconstruction error measured by RMSRE
%-------------------------------------------------------------------
%[row, col] = size(A{1}); % row and column dimensions of A{i}
n = size(A,2); % number of data points
%-------------------------------------------------------------------
for ite = 1:ITE
MU = 0;
for i =1:n
TU = L'* A{i};
MU = MU + TU'*TU;
end;
[V U]=eig(MU);
U=diag(U);
U=flipud(U);
V =fliplr(V);
R=V(:,1:low2);
%-------------------------------------------------------------------
NU = 0;
for i =1:n
TV = A{i}*R;
NU = NU + TV*TV';
end;
[V U]=eig(NU);
U=diag(U);
U=flipud(U);
V =fliplr(V);
L=V(:,1:low1);
end;
%-------------------------------------------------------------------
for i =1:n
M{i} = L'* A{i}*R;
end;
% Compute the RMSRE value (reconstruction error)
err = ERROR(L, M, R, A, n);
%-------------------------------------------------------------------
% THE END OF THE MAIN PROGRAM
%-------------------------------------------------------------------
function error = ERROR(L, M, R, A, n)
% SUBROUTINE TO COMPUTE THE RMSRE VALUE
error = 0;
for i =1:n
A_const{i} = L*M{i}*R';
TEMP = A{i} - A_const{i};
error = error + norm(TEMP,'fro')^2;
end;
error = sqrt(error/n);