## Conditional array accumulation inside parfor

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.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. 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. parfor, array, preallocation MATLAB Answers — New Questions