Parfor Indexing -- Basic question
1 view (last 30 days)
Show older comments
How do you index into a variable if you dont know the size of the loop?
In the first example below parfor works fine.
A = 1:10;
parfor i = 1:length(A)
tmp = rand(A(i));
B(i) = tmp(1);
end
In this example, parfor doesnt work."cannot be run due to the way variable B is used". Such a situation might occur if the case was more complex where B was only assigned an output under certain conditions (IE you dont know the final size of B at the start).
A = 1:10;
B = [];
parfor i = 1:length(A)
tmp = rand(A(i));
B(end+1) = tmp(1);
end
also doesnt work:
A = 1:10;
B = [];
cnt = 1;
parfor i = 1:length(A)
tmp = rand(A(i));
B(cnt) = tmp(1);
cnt = cnt + 1;
end
Hence my question is, how do you index into B in such a case?
0 Comments
Answers (3)
Edric Ellis
on 25 Oct 2013
Here are two ways you could address this. Firstly, using concatenation:
B1 = [];
parfor idx = 1:1000
x = rand();
if x > 0.5
B1 = [B1, x];
end
end
Or, build B with invalid values and strip them later
B2 = NaN(1, 1000);
parfor idx = 1:1000
x = rand();
if x > 0.5
B2(idx) = x;
end
end
B2 = B2(~isnan(B2));
Matlab2010
on 25 Oct 2013
1 Comment
Matt J
on 25 Oct 2013
Yes, you could do that,
parfor i = 1:1000
x = rand();
if x > 0.5
B{i}.field1=...;
B{i}.field2=...;
end
end
B=[B{:}];
Matt J
on 25 Oct 2013
Or, perhaps you meant something like this
fields = {'f1','f2','f3','f4'};
N=length(fields);
vals=cell(1,N);
parfor i = 1:N
switch fields{i}
case 'f1'
vals{i}=1;
otherwise
vals{i}=0;
end
end
args=[fields;vals];
B=struct(args{:})
0 Comments
See Also
Categories
Find more on Parallel for-Loops (parfor) 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!