# Conditional array accumulation inside parfor

28 Ansichten (letzte 30 Tage)
Siva am 19 Mai 2024 um 19:39
Kommentiert: Matt J am 19 Mai 2024 um 21:11
I have a situation were I am testing a condition inside a parfor loop, and if true append the results of a computation to an array. A simplified example is as follows
ary = [];
parfor n=1:N
for m = 1:M
if (f(m,n)>0) % do some test, this is not easily vectorizable
ary = [ary; n m];
end
end
end
I would like, however, to avoid growing arrays in the loop.
I could estimate an upperbound for the size of ary and try to do it this way,
ary = zeros(ubound,2);
ind = 0;
parfor n=1:N
for m = 1:M
if (f(m,n)>0) % do some test, this is not easily vectorizable
ind = ind + 1;
ary(ind,:) = [n m]; % such indexing will not work within parfor
end
end
end
but that wouldn't work as shown in the comment.
Another idea I had was using a logical array to keep track of the conditional result.
condary = false(N*M);
for k = 1:N*M % flatten the loop
% get n and m from k; k = (n-1)*M+m, therefore
m = mod(k,M); if m == 0, m = M; end
n = (k-m)/M+1;
if (f(m,n)>0)
condary(k) = true;
end
end
The desired array, ary, can then be back-constructed from the logical array in a second loop. In fact, ary, can be preallocated at this point. Or the operations meant to be performed using ary can be performed based on condary in a second loop. But this involves flattening the loop.
I was wondering if there are any better ways to do this.
##### 0 Kommentare-2 ältere Kommentare anzeigen-2 ältere Kommentare ausblenden

Melden Sie sich an, um zu kommentieren.

### Akzeptierte Antwort

Matt J am 19 Mai 2024 um 20:01
Bearbeitet: Matt J am 19 Mai 2024 um 20:33
map = false(N,M);
parfor k=1:M*N
[n,m]=ind2sub([N,M],k);
map(k) = ( f(m,n)>0 );
end
[I,J]=find(map);
ary=[I,J];
##### 6 Kommentare4 ältere Kommentare anzeigen4 ältere Kommentare ausblenden
Siva am 19 Mai 2024 um 21:03
Bearbeitet: Siva am 19 Mai 2024 um 21:03
That is pretty cool too. Thank you!
Any implications in terms of the relative memory usage of the two approaches?
Matt J am 19 Mai 2024 um 21:11
The logical array approach stores memory contiguously, which is one reason I like it better.

Melden Sie sich an, um zu kommentieren.

### Kategorien

Mehr zu Parallel for-Loops (parfor) finden Sie in Help Center und File Exchange

R2023b

### Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by