Eliminate for loop: can this code be vectorized?

1 Ansicht (letzte 30 Tage)
Quinten Rensen
Quinten Rensen am 27 Jul. 2018
Kommentiert: Quinten Rensen am 28 Jul. 2018
Hi all,
I am trying to optimize my code, my question is if it is possible to vectorize the following code:
for r = 1:2:(N-1)
U(r,1)=U(r,1)+ (1./K(r,r)).*(F(r,1)-K(r,:)*U(:,1));
end
where U and F are Nx1 vectors and K is a NxN matrix. This part of the code takes a considerable amount of time when N becomes large. Maybe someone has a suggestion on how to vectorize this part?
Thank you!

Akzeptierte Antwort

KSSV
KSSV am 27 Jul. 2018
Bearbeitet: KSSV am 27 Jul. 2018
r = 1:2:(N-1) ;
U(r,1)=U(r,1)+ (1./K(r,r))*(F(r,1)-K(r,:)*U(:,1));
unchecked check the values before using.
  6 Kommentare
Quinten Rensen
Quinten Rensen am 27 Jul. 2018
Bearbeitet: Quinten Rensen am 27 Jul. 2018
Hi Jan, thank you for your quick replies. Maybe it is useful to note that I have defined K as a sparse matrix, so K = [(indices) , value ]
Here is the original code:
function [U,res]=GS(U,F,nelx,nely,sweeps,K)
omega = 1;
count =1;
N = 2.*(nelx+1).*(nely+1);
while count <= sweeps %Number of sweeps;
for r = 1:2:(N-1)
U(r,1)=U(r,1)+omega.*(1./K(r,r)).*(F(r,1)-K(r,:)*U(:,1));
end
for c = 2:2:N
U(c,1)=U(c,1)+omega.*(1./K(c,c)).*(F(c,1)-K(c,:)*U(:,1));
end
count = count + 1;
end
%%Calculate final residual at all points
res = zeros(2.*(nelx+1).*(nely+1),1); %Preallocate
res = F - K*U; %All residuals;
end%End of GS function
And this is the code after I implemented the suggestions:
function [U,res]=GS(U,F,nelx,nely,sweeps,K)
omega = 1;
count =1;
N = 2.*(nelx+1).*(nely+1);
while count <= sweeps %Number of sweeps;
r = 1:2:(N-1)
U(r,1)=U(r,1)+omega.*(1./K(sub2ind(size(K), r, r))).*(F(r,1)-K(sub2ind(size(K), r, :))*U(:,1));
c = 2:2:N
U(c,1)=U(c,1)+omega.*(1./K(sub2ind(size(K), c, c))).*(F(c,1)-K(sub2ind(size(K), c, :))*U(:,1));
count = count + 1;
end
%%Calculate final residual at all points
res = zeros(2.*(nelx+1).*(nely+1),1); %Preallocate
res = F - K*U; %All residuals;
end%End of GS function
Quinten Rensen
Quinten Rensen am 28 Jul. 2018
Ok, I found what was wrong, I had to use the transpose of (1./K(sub2ind(size(K), r, r))). Then the code becomes
r = 1:2:(N-1)
U(r,1)=U(r,1)+omega.*(1./K(sub2ind(size(K), r, r)))'.*(F(r,1)-K(r,:)*U(:,1));
Thank you for your help!

Melden Sie sich an, um zu kommentieren.

Weitere Antworten (0)

Kategorien

Mehr zu Loops and Conditional Statements finden Sie in Help Center und File Exchange

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by