我正在使用SART方法处理断层扫描算法。我使用2D投影来获得3D音量。
我的主要问题是计算时间真的很高。
例如,对于尺寸为88 * 75像素的投影,我的程序需要5天才能完成。
通过使用matlab分析器,我们可以看到具有氡矩阵(很重)乘法的线花费了很多时间。
这就是我想要并行化算法的原因,但我并不熟悉它。
这是我想要并行化的算法的一部分:
line which need a lot of time: Correction = mtimesx(facteur, Matrice_Radon_Transposee, 'SPEED');
for k = 1: ite % Boucle définie par le nombre d 'itérations choisi par l'
utilisateur
Soustraction = Projection2 - Projection_old;
Erreur(ligne, k) = mean(Soustraction);
Err = Erreur(ligne, k);
for z = 1: L * Nproj
for a = 1: L * L
Somme = Somme + Matrice_Radon(z, a) * Matrice_Radon(z, a);
end
facteur = landa / Somme;
Correction = mtimesx(facteur, Matrice_Radon_Transposee, 'SPEED'); % Formule de correction additive de l
'image
Correction = Correction*Soustraction;
Ik1 = Ik + Correction;
Ik=Ik1; % Stockage de l'
image corrigée dans l
'image_itération_précédente
Projection_old=Matrice_Radon*Ik; % Calcul de la projection à partir de l'
image_itération_précédente
end
pos3 = 1;
for incr2 = 1: L
for incr3 = 1: L
Ik2(incr2, incr3) = Ik1(pos3, 1); % Transformation vecteur en matrice
pos3 = pos3 + 1;
end
end
Coupe_SIRT(ligne, : , : ) = Ik2; % Stockage des coupes générées
end
fprintf('Progression : %2d/%d\n', ligne, H); % Affichage de l
'avancement du traitement
end
答案 0 :(得分:0)
我在这里看到很多嵌套的for循环。只要可以在MATLAB中使用,就应该使用矢量化代码而不是for循环来加速算法。此外,无法使用嵌套parfor。
只要您的循环彼此独立(当然您需要安装Parallel Computing Toolbox),就可以实现并行化。在这种情况下使用它非常可以:
result = zeros(1,n); % preallocate result storing array
parfor i=1:n % parallel for loop
%your code here, e.g.:
result(i) = ...;
end
可以手动设置MATALB工作池,但也可以只使用parfor并让MATLAB自动处理池(至少在r2014a中)。
请注意,并行化并不总能加快速度。
答案 1 :(得分:0)
我真的不知道如何对这段代码进行矢量化..
我不需要对所有代码进行矢量化,只需要这2行:
Correction = mtimesx(facteur, Matrice_Radon_Transposee, 'SPEED');
Correction = Correction*Soustraction;
那么并行化for循环可能会很有趣吗? :
for k = 1: ite
写这个是否正确:
result_Projection_old = zeros(1,ite);
result_Ik = zeros(1,ite);
parfor k = 1 : ite
Somme = 0;
Projection_old = result_Projection_old(k);
Ik = result_Ik(k);
Soustraction = Projection2 - Projection_old;
for z=1:LNproj
for a=1:L_carre
Somme = Somme + Matrice_Radon(z,a)*Matrice_Radon(z,a);
end
facteur = landa/Somme;
Correction = mtimesx(facteur,Matrice_Radon_Transposee,'SPEED');
Correction = Correction*Soustraction;
Ik1 = Ik + Correction;
Ik=Ik1;
result_Ik(k) = Ik;
Projection_old=Matrice_Radon*Ik;
result_Projection_old(k) = Projection_old;
end
end
使用此代码,重建不起作用,而不是写result_Ik(k)= Ik我需要写Result_Ik(k + 1)= Ik以便在下一次迭代中从Iération获得Ik的值k-1(上一次迭代)