フィルターのクリア

Conditional array accumulation inside parfor

7 ビュー (過去 30 日間)
Siva
Siva 2024 年 5 月 19 日
コメント済み: Matt J 2024 年 5 月 19 日
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.

採用された回答

Matt J
Matt J 2024 年 5 月 19 日
編集済み: Matt J 2024 年 5 月 19 日
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 件のコメント
Siva
Siva 2024 年 5 月 19 日
編集済み: Siva 2024 年 5 月 19 日
That is pretty cool too. Thank you!
Any implications in terms of the relative memory usage of the two approaches?
Matt J
Matt J 2024 年 5 月 19 日
The logical array approach stores memory contiguously, which is one reason I like it better.

サインインしてコメントする。

その他の回答 (0 件)

カテゴリ

Help Center および File ExchangeParallel for-Loops (parfor) についてさらに検索

製品


リリース

R2023b

Community Treasure Hunt

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

Start Hunting!

Translated by