Convert Nested for-Loops to parfor
3 views (last 30 days)
Show older comments
I want to speed up my script and try to replace nested for loop with parfor. I know that I can parallelize either of the nested loops, but I cannot run both in parallel.
I am not sure how can I use a temporary arrays here if I need to save only recovery matrix.
Thanks for any help!
That is the part of my script I am working on:
%%
resultX0 = zeros(length(n), length(q), ntrials, M, N);
resultY0 = zeros(length(n), length(q), ntrials, M, N);
resultG = zeros(length(n), length(q), ntrials, M, N);
for i=1:length(n)
for j=1:length(q)
for k=1:ntrials
[G,X0,Y0]=matrix_plantsubm(M,N,c,n(i),p,q(j));
resultX0(i,j,k,:,:)=X0;
resultY0(i,j,k,:,:)=Y0;
resultG(i,j,k,:,:)=G;
end
end
end
%%
recovery = zeros(length(n), length(q));
error = zeros(length(n), length(q));
resultX=zeros(length(n),length(q), ntrials, M, N);
resultY=zeros(length(n),length(q), ntrials, M, N);
parfor i=1:length(n)
for j=1:length(q)
% Set gamma as in paper.
gamma = 6/((q(j) - p)*n(i));
for k=1:1:ntrials
tic
[X,Y,Q, iter] = ADMMcopy(squeeze(resultG(i,j,k,:,:)),c, n(i),q(j), gamma,tau, opt_tol, verbose, maxiter);
resultX(i,j,k, :, :)=X;
resultY(i,j,k, :, :)=Y;
C=resultX-resultX0;
a=arrayfun(@frobeniusnorm,C).^2;
b=arrayfun(@frobeniusnorm,resultX0).^2;
if a(i,j,k)/b(i,j,k)<opt_tol
recovery(i,j)=recovery(i,j)+1;
error(i,j)=error(i,j)+a(i,j,k)/b(i,j,k);
else
recovery(i,j)=0;
toc
save('Sparse_case.mat','recovery', '-v7.3');
end
end
end
end
0 Comments
Answers (2)
Walter Roberson
on 30 Nov 2018
inside the parfor
trec = zeroes(1,length(q))
inside the for k
trec(1,j) = trec(1,j) + whatever
After the for j terminates
recovery(i,:)=trec;
You probably need something similar for error .
It would be better to rename error to avoid interfering with the important infrastructure function named error
0 Comments
Matt J
on 30 Nov 2018
Edited: Matt J
on 30 Nov 2018
You can convert the first set of nested loops to a single parfor loop as below. The second set of nested-loops is non-parallelizable because the computation of C depends on all preceding iterations of the loops.
sz=[length(n), length(q)];
S=prod(sz);
resultX0 = zeros(S,ntrials, M, N);
resultY0 = zeros(S,ntrials, M, N);
resultG = zeros(S,ntrials, M, N);
parfor s=1:S
[i,j] = ind2sub(sz,s);
[G,X0,Y0]=matrix_plantsubm(M,N,c,n(i),p,q(j));
resultX0(s,:,:,:)=repmat(X0,1,ntrials,1,1);
resultY0(s,:,:,:)=repmat(Y0,1,ntrials,1,1);
resultG(s,:,:,:)=repmat(G,1,ntrials,1,1);
end
resultX0 = reshape(resultX,[sz ntrials M N]);
resultY0 = reshape(resultY0,[sz ntrials M N]);
resultG = reshape(resultG,[sz ntrials M N]);
0 Comments
See Also
Categories
Find more on Loops and Conditional Statements in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!