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: