MATLAB: Help! “Parfor” error: Subscripted assignment dimension mismatch

parallel computingparforsubscripted assignment dimension mismatch

Hi. I'm converting some sequential codes into parallel codes. The former works well. But I came across the following errors when running the parallel codes. Can anyone help me? Thanks.
??? Error using ==> parallel_function>make_general_channel/channel_general at 843 Subscripted assignment dimension mismatch.
Error in ==> parallel_function>distributed_execution at 752 [tags, out] = P.getCompleteIntervals(chunkSize);
Error in ==> parallel_function at 564 R = distributed_execution(…
Error in ==> SensitivityForNaturalBreachFreqParfor3 at 8 SANaturalBreachFreq = zeros(4,14);
??? Operation terminated by user during ==> NormalFlow
In ==> NaturalBreachFreq at 275 [h_begin, u_begin] = NormalFlow(Q_begin,B_prtC,s_prtC,n_prtC);
In ==> parallel_function>make_general_channel/channel_general at 843 O = F(C{:});
In ==> remoteParallelFunction at 28 out = distcompMakeByteBufferHandle(distcompserialize(feval(channel, channelArgs{:})));
****************The parallel codes:
SANaturalBreachFreq = zeros(4,14); % The outputs
parfor i=1:4 % Test four iterations
V = zeros(1,14);
V(i,1:3) = SA3Parameters(i,1:3); % All inputs loaded into the workspace
[Z_prtC,Z_levee] = ChnlElevations(H_prtC,V(i,1),rDep_chnl,rDep_bsn);
E_weak = 0.2*V(i,2)^(-0.5)*1e-6;
Lweak = 0.05*L_prtC/V(i,3);
[BreachYearNo,BigBreachYearNo,BreachNo,BigBreachNo,AvulsionNo,AllBreachNo,MajorBreachW,MajorBreachQout_pct,...
Avulsion,AllBreachYearNo]...
= NaturalBreachFreq(Qd,Qsd,Qpct_overtop,Qpct_bifur,Qpct_avlsn,yBifur,Big_pct,H_prtC,Z_prtC,Z_levee,...
B_prtC,s_prtC,n_prtC,tauCr,V(i,2),nDcr,V(i,3),Lweak,E,E_weak,D_breach0,B_breach0,dL,n_star,...
n_breach,dL_outfl,p_wash,d50,ws_m,rho_s,rho_m,p,dt);
V(i,4) = AvulsionNo;
if ~isempty(Avulsion)
V(i,5) = Avulsion(1);
V(i,6) = Z_levee(Avulsion(3))/Hbar;
end
V(i,7) = AllBreachYearNo;
V(i,8) = BreachYearNo;
V(i,9) = BigBreachYearNo;
V(i,10) = AllBreachNo;
V(i,11) = BreachNo;
V(i,12) = BigBreachNo;
V(i,13) = MajorBreachW;
V(i,14) = MajorBreachQout_pct;
SANaturalBreachFreq(i,:) = V;
end

Best Answer

In the body of your loop, you create V as 1-by-14, but you assign into it using "V(i,1)" etc. Finally, you assign into "SANaturalBreachFreq(i,:) = V;" - this will be incorrect because "V" is now not the correct size. Surely you should be doing something more like
parfor i = 1:4
V = zeros(1,4);
V(1) = ...;
...
V(14) = ...;
SANaturalBreachFreq(i,:) = V;
end