La domanda risale a parecchio tempo fa ed il problema sarà stato risolto, ma, forse (e spero), questa risposta può essere utile a qualcuno.
La lentezza dello script allegato alla domanda è dovuta al fatto che vengono utilizzati dei "
cicli for" per assegnare valori alla
matrice target "b".
In aggiunta, lo script contiene un errore: i due loop più interni ("
h" ed "
m") assegnano, in sequenza, all'elemento "
b(i,j)" tutti i valori della matrice "
a". Infatti durante i due cicli, gli indici "
i" e "
j" non cambiano; questo fa si che, al termine dell'esecuzione dello script, tutti gli elementi della matrice "" contengono l'ultimo valore della matrice "
a"
L'errore si risolve rimuovendo i due loop più interni e sostituendo l'istruzione:
b(i,j)= a(h,k);
con l'istruzione:
b(i,j)= a(i-order+1,j-order+1);
Un metodo molto più veloce per assegnare i valori della matrice "
a" alla matrice "
b" ed aggiungere un certo numero di righe alla stessa matrice "
b" è quello che utilizza la "
colon notation" (operatore "
:").
Nello specifico, il set di istruzioni definite nello script originale comprendente i due loop più esterni (quelli interni sono da eliminare) e l'istruzione di assegnazione a "
b" dei valori di "
a" si possono sostituire con la sola istruzione che segue:
c(order:end-order+1,order:end-order+1)=a;
in essa, l'intera matrice "
a" viene direttamente assegnata (copiata) all'interno della matrice "
c" nell'area definita da:
[*]
order:end-order+1 ==> dalla riga "
order" alla riga "
end - order +1" ("
end" identifica l'ultimo elemento - riga o colonna - di un vettore o matrice)
[*]
order:end-order+1 ==> dalla colonna "
order" alla colonna "
end - order +1"
A titolo di esempio, nello script che segue i tempi di esecuzione dei due metodi vengono messi a confronto:
[*] tempo di esecuzione del "metodo loop" [s]:
11.700627
[*] tempo di esecuzione del "metodo colon notation" [s]:
0.019433
dimensione della matrice "
a":
901 x 1201 x 3
%
% Lettura immagine: l'immagine è stata creata salvando la "figure" creata
% con l'istruzione "peak", con la seguente istruzione:
%
% print -djpeg99 peaks_img
%
a=imread('peaks_img.jpg');
%
% Definizione numero di righe da aggiungere
%
order=13;
%
% Inizializzazione misuratore tempo di esecuzione
%
tic
%
% Script originale
%
[m,n,x]=size(a);
t=m+(2*(order-1));
e=n+(2*(order-1));
b=zeros(t,e,3,'uint8');
for i=order:(t-(order-1))
for j=order:(e-(order-1))
%
% I due lop seguenti e l'istruzione che segue sono da cancellare
%
% % % for h=1:m
% % % for k=1:n
% % % b(i,j)= a(h,k);
%
% Istruzione corretta
%
b(i,j,:)= a(i-order+1,j-order+1,:);
% % % end
% % % end
end
end
%
% Print del tempo impiegato per l'esecuzione del codice che precede
%
toc
%
% Medodo alternativo basato sull'utilizzo di "colon notation"
%
% Inizializzazione misuratore tempo di esecuzione
%
tic
%
% Come da script originale
%
t=m+(2*(order-1));
e=n+(2*(order-1));
c=zeros(t,e,3,'uint8');
%
% Questa istruzione è equivalente ai due loop dello script originale
%
c(order:end-order+1,order:end-order+1,:)=a;
%
% Print del tempo impiegato per l'esecuzione del codice che precede
%
toc
figure('name','Immagine Originale')
imshow(a)
figure('name','Immagine Metodo "loop"')
imshow(b)
figure('name','Immagine Metodo "colon notation')
imshow(c)
Hope this helps.
Allegati: