Nested for loop in parfor, indexing
조회 수: 1 (최근 30일)
이전 댓글 표시
Hello!
I'm running Monte Carlo simulation in Matlab 2012a, the following code returns an error
if matlabpool('size') == 0
matlabpool open
end
parfor i=1:M
for j=2:N
x(i,j)=x1(i,j-1)+sqrt(x(i,j-1))
y(i,j)=y(i,j-1)+sqrt(y(i,j-1))
z(i,j)=z(i,j-1)+x(i,j-1)+y(i,j-1)
end
end
matlabpool close
(Definitions of x ,y, z are simplified but the main idea remains) As I understand it is impossible to use indexing this way in a nested 'for' 'cos Matlab cannot check if array elements are independent. But in my situation it's clear that index i (different MC paths are independent) is remaining unchanged in for loop, only j (time steps) is being changed. Could you please give me a piece of advice with this issue?
Thanks in advance, Alex.
P.S. the error is obvious for such cases: The variable x in a parfor cannot be classified.
댓글 수: 0
채택된 답변
ChristianW
2013년 3월 14일
You could use a seperated variable for the inner loop. On the example of x:
X = zeros(M,N); %preallocate
parfor i=1:M
x1 = zeros(1,N); %preallocate
x1(1) = x(i,1);
for j=2:N
x1(j)=x1(j-1)+sqrt(x1(j-1));
end
X(i,:) = x1;
end
But usually this should be much faster:
X1 = [x zeros(M,N-1)]; % first column and preallocate
for k=2:N
X1(:,k)=X1(:,k-1)+sqrt(X1(:,k-1));
end
댓글 수: 2
ChristianW
2013년 3월 15일
Both work. The first one is faster. You have some errors in it. You need to give him the first column.
x2 = [x zeros(M,N-1)]; % first column and preallocate
eps1 = randn(M,N);
for j = 2:N
x2(:,j) = x2(:,j-1)+eps1(:,j-1).*sqrt(x2(:,j-1));
end
x3 = [x zeros(M,N-1)]; % first column and preallocate
for j=2:N
eps1 = randn(M,1);
x3(:,j) = x3(:,j-1)+eps1.*sqrt(x3(:,j-1));
end
추가 답변 (0개)
참고 항목
카테고리
Help Center 및 File Exchange에서 Loops and Conditional Statements에 대해 자세히 알아보기
제품
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!