function [T P U Q W B ] = PLSF2 (X,Y,nLV)
% 
% Inputs:
% X     matrice dei dati di ingresso del modello (campioni x variabili)
% Y     matrice delle uscite del modello (campioni x variabili)
% 
% Outputs:
% T     matrice degli "score" per X
% P     matrice dei "pesi" per X
% U     matrice degli "score" per Y
% Q     matrice dei "pesi" per Y
% B     matrice dei coefficienti di regressione del modello ingresso uscita
% 

% calcolo la dimensione delle matrici di ingresso X e Y

[nX,mX]  =  size(X);
[nY,mY]  =  size(Y);

%nMaxIterazione = max([mX,mY]);
nMaxOuter = 10000;
for iIterazione = 1 : nLV
    %scelgo la colonna della matrice X in base al massimo valore quadrato
    %presente nella diagonale (varianza) e la pongo uguale a t_temporaneo
    % scelgo la colonna di Y in base al massimo valore quadrato
    %presente nella diagonale (varianza) e la pongo uguale a u_temporaneo
    [valore,tNum] =  max(diag(X'*X));
    [valore,uNum] =  max(diag(Y'*Y));
    tTemp = X(:,tNum);
    uTemp = Y(:,uNum);
 % iterazioni per il modello esterno "outer" 
    for iOuter = 1 : nMaxOuter
        wTemp =( X' * uTemp)/ norm(X' * uTemp);
        tNew = X * wTemp;
        qTemp = (Y' * tNew)/ norm(Y' * tNew);
        uTemp = Y * qTemp;
        if norm(tTemp - tNew)/norm(tNew) < 10e-8
            break
        end
       
        tTemp = tNew;
        
    end
    % calcola i valori residui per la prossima iterazione del modello outer
    % in pratica calcola il modello "inner"
    pTemp = (X' * tTemp)/ (tTemp'*tTemp);
    %modifiche-------------------------
    wTemp=wTemp/norm(tTemp);
    bTemp = uTemp'*tTemp/(tTemp'*tTemp);
    X = X - tTemp * pTemp';
    Y = Y - bTemp * tTemp * qTemp';
    % save iteration results to outputs:
    T(:, iIterazione)           = tTemp;
    P(:, iIterazione)           = pTemp;
    U(:, iIterazione)           = uTemp;
    Q(:, iIterazione)           = qTemp;
    W(:, iIterazione)           = wTemp;
    B(iIterazione,iIterazione)   = bTemp;
   
 end
end