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 somma elementi di una matrice
Confronto tempi di esecuzione prodotto di due matrici
Confronto tempi di esecuzione "prodotto puntuale" di due matrici