Programmini di calcolo matrici

di il
1 risposte

Programmini di calcolo matrici

Salve sono nuovo in questo forum,sono un ingegnere ambientale, attualmente sto facendo la specialistica e ho iniziato a prendere un po di dimmestichezza con questo programma. Ho scritto due programmini abbastanza semplici e volevo sapere se era possibile ottenere lo stesso risultato però con l'utilizzo dei cicli for e con strutture come if, elseif e else;

I programmini che ho scritto sono:
1)
function somma= matrici(A,B)
P=A.*B;
s=sum(P);
somma=sum(s);
2)
function media= med(A)
media= sum(A,1)/length(A);
% A=round((30-18)*rand(5,4)+18)


Grazie a tutti gentilissimi.

1 Risposte

  • Re: Programmini di calcolo matrici

    La domanda è piuttosto lontana nel tempo, ma forse, la risposta può essere utile a qualcuno.

    L'utilizzo delle funzioni e degli operatori di MatLab per operare con le matrici è preferibile ai metodi "manuali" in quanto estremamente più veloci e più semplici da implementare (ad esempio, non richiedono, di principio, la codifica di "cilci for").

    Ad ogni modo, la domanda richiedendo esempi con l'utilizzo di cicli "for" e / o blocchi "if-esle", il primo dei due script in calce mette a confronto possibili soluzioni per il calcolo di prodotti, somme e medie utilizzando funzioni / operatori di MatLab e metodi "manuali" (cilci for).

    Lo script esegue i calcoli operando, iterativamente, su matrici quadrate di dimensioni crescenti per evidenziare le differenze nei tempi di esecuzione dei due approcci al crescere della dimensione delle matrici.

    Il secondo script (plot_prodotto_matrici_manuale.m) invocato al termine del primo, genera quattro grafici che mettono a confronto i tempi ("elapsed time" o "cputime", a scelta dell'utente) richiesti per effettuare i calcoli.

    Script per l'esecuzione dei calcoli
    
    %
    % Definizione della dimensione delle matrici usate per la prove
    %
    dim_matr=5:10:500;
    %
    % Inizializzaizone indice vettori risultati
    %
    idx=0;
    %
    % Inizializzazione vettori tempi di esecuzione operazioni con matrici
    %
    Pt=zeros(length(dim_matr),1);
    St=zeros(length(dim_matr),1);
    Mt=zeros(length(dim_matr),1);
    Ptman=zeros(length(dim_matr),1);
    Stman=zeros(length(dim_matr),1);
    Mtman=zeros(length(dim_matr),1);
    P1t=zeros(length(dim_matr),1);
    P1tman=zeros(length(dim_matr),1);
    %
    % Flag modalità di calcolo dei tempi di esecuzione:
    %    1: tic - toc
    %    0: cputime
    %
    use_tic_toc=1;
    %
    % Loop operazioni con matrici di dimensione crescente
    %
    for s_m=dim_matr
       idx=idx+1;
       %
       %    Creazione matrici
       %
       A=rand(s_m);
       B=A*10;
       %
       %    Controllo dimensioni matrici (da usare nel caso le matrici siano in
       %    input
       %
       [ra,ca]=size(A);
       [rb,cb]=size(B);
       
       if(~((ra == rb) && (ca == cb)))
          disp('PRODOTTO PUNTUALE MATRICI ERRORE: le due matrici non hanno la stessa dimensione')
       else
          %
          % Attivazione calcolo tempo di esecuzione operazione corrente
          %
          if(use_tic_toc)
             tic
          else
             t=cputime;
          end
          %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
          % PRODOTTO "PUNTUALE" DI DUE MATRICI %
          % (ELEMENTO PER ELEMENTO)            %
          % METODO "MATLAB"                    %
          %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
          P=A.*B;
          %
          % Calcolo tempo di esecuzione
          %
          if(use_tic_toc)
             Pt(idx)=toc;
          else
             Pt(idx)=cputime-t;
          end
          %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
          % PRODOTTO "PUNTUALE" DI DUE MATRICI %
          % (ELEMENTO PER ELEMENTO)            %
          % METODO "MANUALE": CICLI FOR        %
          %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
          %
          % Inizializzazione matrice risultato
          %
          Pman=zeros(ra,ca);
          %
          %    Attivazione calcolo tempo di esecuzione operazione corrente
          %
          if(use_tic_toc)
             tic
          else
             t=cputime;
          end
          %
          %       Loop per il calcolo del prodotto "elemento per elemento delle
          %       due matrici
          %
          for i=1:ra
             for j=1:ca
                Pman(i,j)=A(i,j)*B(i,j);
             end
          end
          %
          %    Calcolo tempo di esecuzione
          %
          if(use_tic_toc)
             Ptman(idx)=toc;
          else
             Ptman(idx)=cputime-t;
          end
          % P-Pman;
       end
       %
       %    Attivazione calcolo tempo di esecuzione operazione corrente
       %
       if(use_tic_toc)
          tic
       else
          t=cputime;
       end
       %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
       % SOMMA DEGLI ELEMENTI DI UNA MATRICE %
       % (la matrice è quella in precedenza) %
       % METODO "MATLAB"                     %
       %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
       S=sum(sum(P));
       %
       %    Calcolo tempo di esecuzione
       %
       if(use_tic_toc)
          St(idx)=toc;
       else
          St(idx)=cputime-t;
       end
       %
       %    Inizializzazione variabile "somma"
       %
       Sman=0;
       %
       %    Attivazione calcolo tempo di esecuzione operazione corrente
       %
       if(use_tic_toc)
          tic
       else
          t=cputime;
       end
       %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
       % SOMMA DEGLI ELEMENTI DI UNA MATRICE %
       % (la matrice è quella in precedenza) %
       % METODO "MANUALE" (CICLI FOR)        %
       %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
       for i=1:ra
          for j=1:ca
             Sman=Sman+Pman(i,j);
          end
       end
       %
       %    Calcolo tempo di esecuzione
       %
       if(use_tic_toc)
          Stman(idx)=toc;
       else
          Stman(idx)=cputime-t;
       end
    %
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    %
       if(ra ~= cb)
          Disp('PRODOTTO MATRICI ERRORE: numero righe matrice A diverso numero colonne matrice B')
       else
          %
          %    Attivazione calcolo tempo di esecuzione operazione corrente
          %
          if(use_tic_toc)
             tic
          else
             t=cputime;
          end
          %%%%%%%%%%%%%%%%%%%%%%%%%%%
          % PRODOTTO DI DUE MATRICI %
          % METODO "MATLAB"         %
          %%%%%%%%%%%%%%%%%%%%%%%%%%%
          P1=A*B;
          %
          %    Calcolo tempo di esecuzione
          %
          if(use_tic_toc)
             P1t(idx)=toc;
          else
             P1t(idx)=cputime-t;
          end
          %
          %       Inizializzazione matrice risultato
          %
          P1man=zeros(ra,ca);
          %
          %    Attivazione calcolo tempo di esecuzione operazione corrente
          %
          if(use_tic_toc)
             tic
          else
             t=cputime;
          end
          %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
          % PRODOTTO DI DUE MATRICI      %
          % METODO "MANUALE" (CICLI FOR) %
          %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
          for i=1:ra
             for j=1:ca
                for k=1:cb
                   P1man(i,j)=P1man(i,j)+A(i,k)*B(k,j);
                end
             end
          end
          %
          %    Calcolo tempo di esecuzione
          %
          if(use_tic_toc)
             P1tman(idx)=toc;
          else
             P1tman(idx)=cputime-t;
          end
          % P1-P1man;
       end
       %
       %    Attivazione calcolo tempo di esecuzione operazione corrente
       %
       if(use_tic_toc)
          tic
       else
          t=cputime;
       end
       %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
       % CALCOLO MEDIA DEI VALORI DELLE COLONNE DI UNA MATRICE %
       % FUNZIONE "mean"                                       %
       %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
       M=mean(A,1);
       %
       %    Calcolo tempo di esecuzione
       %
       if(use_tic_toc)
          Mt(idx)=toc;
       else
          Mt(idx)=cputime-t;
       end
       %
       % Inizializzazione vettore risultati
       %
       media=zeros(ca,1);
       %
       %    Attivazione calcolo tempo di esecuzione operazione corrente
       %
       if(use_tic_toc)
          tic
       else
          t=cputime;
       end
       %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
       % CALCOLO MEDIA DEI VALORI DELLE COLONNE DI UNA MATRICE %
       % METODO "MANUALE (CICLI FOR)                           %
       %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
       for i=1:ra
          tmp_s=0;
          for j=1:ra
             tmp_s=tmp_s+A(j,i);
          end
          media(i)=tmp_s/ra;
       end
       %
       %    Calcolo tempo di esecuzione
       %
       if(use_tic_toc)
          Mtman(idx)=toc;
       else
          Mtman(idx)=cputime-t;
       end
       
       s_m
    end
    %
    % Plot tempi di esecuzione delle varie operazione con i due metodi "MATLAB"
    % e "MANUALE (CICLI FOR)"
    %
    plot_prodotto_matrici_manuale
    
    Script per la creazione dei grafici (plot_prodotto_matrici_manuale.m)
    
    x_label='Numero Righe (Matrice quadrata)';
    if(use_tic_toc)
       y_label='Elapsed time [s]';
    else
       y_label='CPU time [s]';
    end
    
    figure
    plot(dim_matr,Pt,'b','linewidth',2)
    hold on
    plot(dim_matr,Ptman,'r','linewidth',2)
    title('Prodotto Puntuale MAtrici (A.*B)')
    grid on
    xlabel(x_label);
    ylabel(y_label);
    legend('MatLab alg.','Manual','location','SouthOutside','orientation','horizontal');
    
    figure
    plot(dim_matr,P1t,'b','linewidth',2)
    hold on
    plot(dim_matr,P1tman,'r','linewidth',2)
    title('Prodotto Matrici (A*B)')
    grid on
    xlabel(x_label);
    ylabel(y_label);
    legend('MatLab alg.','Manual','location','SouthOutside','orientation','horizontal');
    
    figure
    plot(dim_matr,St,'b','linewidth',2)
    hold on
    plot(dim_matr,Stman,'r','linewidth',2)
    title('Somma Matrici')
    grid on
    xlabel(x_label);
    ylabel(y_label);
    legend('MatLab alg.','Manual','location','SouthOutside','orientation','horizontal');
    
    figure
    plot(dim_matr,Mt,'b','linewidth',2)
    hold on
    plot(dim_matr,Mtman,'r','linewidth',2)
    title('Media')
    grid on
    xlabel(x_label);
    ylabel(y_label);
    legend('MatLab alg.','Manual','location','SouthOutside','orientation','horizontal');
    
    Hope this helps.
    Allegati:
    Confronto tempi di esecuzione media (su colonne)
    Confronto tempi di esecuzione media (su colonne)

    Confronto tempi di esecuzione somma elementi di una matrice
    Confronto tempi di esecuzione somma elementi di una matrice

    Confronto tempi di esecuzione prodotto di due matrici
    Confronto tempi di esecuzione prodotto di due matrici

    Confronto tempi di esecuzione "prodotto puntuale" di due matrici
    Confronto tempi di esecuzione "prodotto puntuale" di due matrici
Devi accedere o registrarti per scrivere nel forum
1 risposte