Je veux calculer la distance euclidienne entre deux images en utilisant le noyau de Tangente hyperbolique (Sigmoïde). S'il vous plaît suivez this lien où j'ai discuté du même problème en utilisant Gaussian Kernel en détail.Optimiser matlab pour la boucle pour le Big Data
Si x=(i,j)
& y=(i1,j1)
sont tous deux pixels dans notre image puis pour le noyau tangente hyperbolique, mon H(x,y)
sera défini comme: H(i,j) = tanh(alpha*(x'*y) + c)
où alpha
et c
sont des paramètres et x'
est la transposition de x
. Le paramètre alpha
peut être pris comme 1/N où N est ma dimension d'image (8192 x 200 dans mon cas) et c peut prendre n'importe quelle valeur en fonction du problème. Une description plus détaillée du noyau Tangent hyperbolique peut être trouvée here.
Pour atteindre mon objectif & en tenant compte du temps d'exécution, j'ai écrit le script MATLAB ci-dessous.
gray1=zeros(8192,200);
gray2=zeros(8192,200);
s1 = 8192;
s2 = 200;
alpha = s1*s2;
perms = combvec(1:s2,1:s1);
perms = [perms(2,:);perms(1,:)]';
perms1 = perms;
gray1(4096,100) = 10;
gray2(10,100) = 10;
img_diff = gray1 - gray2;
display('Calculation of Sigmoid Kernel started');
for i = 1:length(perms1)
kernel = sum(bsxfun(@times,perms,perms1(i,:))');
kernel1 = tanh((1/alpha)*kernel + 1)';
g_temp(i) = img_diff(:)'*kernel1;
end
temp = g_temp*img_diff(:);
ans = sqrt(temp);
Malgré tous mes efforts, je n'ai pas pu le vectoriser davantage afin de réduire son coût de fonctionnement. Actuellement, cela prend environ 29 heures à compléter ce qui est trop pour moi car je veux l'exécuter pour différentes images. Je veux lui donner une forme complètement vectorisée en utilisant des fonctions MATLAB intrinsèques comme cela a été fait par @ dan-man dans le cas de Gaussian Kernel. Avec son aide, la version gaussienne prenait 1-2 secondes pour terminer. J'ai essayé de mon mieux d'utiliser la même fonction conv2fft
dans ce cas aussi, mais il semble difficile de trouver un moyen d'y parvenir.
Quelqu'un peut-il m'aider s'il vous plaît à enlever ce un supplémentaire pour la boucle afin d'obtenir le coût de fonctionnement de l'algorithme dans la même proportion que celle de la version gaussienne du même problème.
Merci d'avance.
l'avez-vous profilé? –
Wow, votre boucle for est '1638400', c'est beaucoup eh –
@Ander Yeah..J'ai profilé. Cela prend environ 50 secondes pour seulement 780 itérations. Par conséquent, pour 1638400 itérations, cela prendra environ 29 heures. – nagarwal