Problem with parfor classified variable
    7 views (last 30 days)
  
       Show older comments
    
    Stefano Maffei
 on 30 Jul 2019
  
    
    
    
    
    Commented: Stefano Maffei
 on 5 Aug 2019
            I am trying to parallelize a for loop. Here is a minimal working example of what I am trying to do at the moment.
nx = 96;
ny = nx;
Tk_all = zeros(nx,ny);
Tkp_all = zeros(2*kmax+1,kmax+1,nx,ny);
dim2 = 31;
dim3 = 31;
kmax = min(dim2,dim3);
c = parcluster('local');
c.NumWorkers = 24;
parpool(c, c.NumWorkers);
for kxi=-kmax:kmax
  parfor kyi=0:kmax
     Tk_entry = kxi*kyi*ones(nx,ny); % should be something more meaningful
     Tk_all(nx/2+(kxi-1)+1,ny/2+(kyi-1)+1) = sum(reshape(Tk_entry,nx*ny,1));
     Tkp_all(kmax+1+(kxi-1)+1,1+(kyi-1)+1,:,:) = Tk_entry;
  end
  Tk_all(nx/2-(kxi-1)+1,ny/2-([0:kmax]-1)+1) = Tk_all(nx/2+(kxi-1)+1,ny/2+([0:kmax]-1)+1);
end
delete(gcp('nocreate'))
and I receive the error
Error: The variable Tk_all in a parfor cannot be classified.
I though I was satisfying the requirements from, for example here:
but clearly I am missing something. Any help?
I apologize if this question seems to be a duplicate of other existing questions, but I cannot seem to figure out my specific problem.
Thanks!
0 Comments
Accepted Answer
  Abhilash Padma
    
 on 2 Aug 2019
        The variable Tk_alland Tkp_all are not meeting the requirements of a sliced variable. For a sliced variable, exactly one indexing expression must be of the form i, i+k, i-k, or k+i. The index i is the loop variable and k is a scalar integer constant or a simple (non-indexed) broadcast variable. Every other indexing expression is a positive integer constant, a simple (non-indexed) broadcast variable, a nested for-loop index variable, colon, or end. The following code will work in your case:
nx = 96;
ny = nx;
Tk_all = zeros(nx,ny);
dim2 = 31;
dim3 = 31;
kmax = min(dim2,dim3);
Tkp_all = zeros(2*kmax+1,kmax+1,nx,ny);
c = parcluster('local');
c.NumWorkers = 24;
parpool(c, c.NumWorkers);
for kxi=-kmax:kmax
    k1=kxi+nx/2;
    k2=ny/2;
    k3=kmax+1+kxi;
  parfor kyi=0:kmax
     Tk_entry = kxi*kyi*ones(nx,ny); % should be something more meaningful
     Tk_all(k1,k2+kyi) = 1;
     Tkp_all(k3,1+kyi,:,:) = Tk_entry;
  End
  Tk_all(nx/2-(kxi-1)+1,ny/2-((0:kmax)-1)+1) = Tk_all(nx/2+(kxi-1)+1,ny/2+((0:kmax)-1)+1);
end
delete(gcp('nocreate'));
More Answers (0)
See Also
Categories
				Find more on Loops and Conditional Statements in Help Center and File Exchange
			
	Products
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!
