valid indices in a parfor loop
8 ビュー (過去 30 日間)
古いコメントを表示
Can someone please explain why the following code does not work in the parfor loop? The error is about invalid indices on the matrix 'mat'.
inds = 1:ptsPerCore*nCores;
inds = reshape(inds,ptsPerCore,nCores);
mat = zeros(ptsPerCore*nCores,n);
parfor ii=1:nCores
par_inds = inds(:,ii);
for jj=1:ptsPerCore
cur_ind = par_inds(jj);
vec = randn(1,n);
mat(cur_ind,:) = vec;
end
end
0 件のコメント
採用された回答
Matt J
2022 年 6 月 7 日
編集済み: Matt J
2022 年 6 月 7 日
You are trying to use the parfor loop to fill a pre-existing matrix mat. The only type of parfor variable for which this is allowed is a Sliced Variable. Indexing into sliced variables must obey certain rules:
その他の回答 (1 件)
Edric Ellis
2022 年 6 月 9 日
There are a couple of ways to work around this. You can either unroll the inner loop, or else make the output matrix 3d so that it is sliceable (and then use reshape to get back).
%% Original code
ptsPerCore = 7;
nCores = 5;
n = 3;
inds = 1:ptsPerCore*nCores;
inds = reshape(inds,ptsPerCore,nCores);
mat = zeros(ptsPerCore*nCores,n);
for ii=1:nCores
par_inds = inds(:,ii);
for jj=1:ptsPerCore
cur_ind = par_inds(jj);
vec = cur_ind.*(1:n);
mat(cur_ind,:) = vec;
end
end
%% Alternative 1 - run as a single loop
mat2 = zeros(ptsPerCore*nCores,n);
parfor iijj = 1:(nCores * ptsPerCore)
vec = iijj.*(1:n);
mat2(iijj,:) = vec;
end
assert(isequal(mat2, mat));
%% Alternative 2 - use a 3d output
mat3 = zeros(ptsPerCore, nCores, n);
parfor ii=1:nCores
par_inds = inds(:,ii);
for jj=1:ptsPerCore
cur_ind = par_inds(jj);
vec = cur_ind.*(1:n);
mat3(jj, ii, :) = vec;
end
end
% Need to reshape back to original size
mat3 = reshape(mat3, nCores*ptsPerCore, n);
assert(isequal(mat3, mat));
参考
カテゴリ
Help Center および File Exchange で Parallel for-Loops (parfor) についてさらに検索
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!