Discover MakerZone

MATLAB and Simulink resources for Arduino, LEGO, and Raspberry Pi

Learn more

Discover what MATLAB® can do for your career.

Opportunities for recent engineering grads.

Apply Today

To resolve issues starting MATLAB on Mac OS X 10.10 (Yosemite) visit: http://www.mathworks.com/matlabcentral/answers/159016

Parfor Step

Asked by Brian on 11 Jun 2012

I am attempting to run a ParFor statement with a step function and Matlab is giving me an error "The range of a parfor statement must be increasing consecutive integers. See Parallel Computing Toolbox, "parfor"." I'm wondering if this is possible or if I have to do some manipulation to my loop to get this to work in parallel. Would someone be able to make a suggestion as to how to modify one of these loops so that it will work in parallel?

Simplified Example

      parfor (i = 1:10:75,8)
          test3(i)= i*3;
      end

Real Example

parfor (i = 1:10:75,8)
    tic
    recnum = min(i+9,length(test));
    datainsert(conn,'dbo.tbl_FactorExposure_Security',{'CUSIP','MktDate','Factor_Exp','Factor_Num'},MyData(i:recnum,:));
    disp(i)
    toc
end

Thanks a lot! Brian

2 Comments

Walter Roberson on 11 Jun 2012

Sorry? What do you intend

for (i = 1:10:75,8)

to mean? Is it intended as

for i = [1:10:75, 8]

meaning

for i = [1 11 21 31 41 51 61 71 8]

?

Brian on 11 Jun 2012

Yeah, sorry for being unclear. In my real example I am breaking up the size of my datainsert command by using a step function. I'm doing this because I'm inserting about 28 million records and the java heap size in Matlab is running out of memory. SInce I'm breaking it up, I'd like to do the datainsert in parallel so that it's not so slow.

Brian

Products

1 Answer

Answer by Edric Ellis on 12 Jun 2012
Accepted answer

As the doc states, PARFOR needs to work with unit-step ranges. So you do need to re-work the loop slightly, something like this:

   idx = 1:10:75;
   parfor (i = 1:numel(idx), 8)
     val = idx(i);
     test3t(i) = val * 3;
   end

That example leaves 'test3t' slightly different to 'test3' in your example, you can rearrange things by doing

test3(idx) = test3t;

2 Comments

Brian on 12 Jun 2012

Thanks a lot Edric. I am still new to Matlab and frankly, sometimes the documentation, although very thorough, goes right over my head.

Brian

Edric Ellis on 12 Jun 2012

By the way, the syntax using the extra parentheses around the PARFOR arguments is rarely needed, it's much simpler just to write "parfor i = 1:numel(idx)".

Edric Ellis

Contact us