How to iterate over parfor

1 vue (au cours des 30 derniers jours)
Luca Pecoriello
Luca Pecoriello le 10 Déc 2019
Commenté : Luca Pecoriello le 11 Déc 2019
Hi everyone.
I need to apply some heavy signal processing to a third-order tensor (typcal set of data coming from thermography). The data has the structure of pixel-pixel-time.
I wanto to use the parfor, but I am struggling in implementing a for loop.
I am aware that this syntax does not work:
%% mock data
input signal = zeros(1,3000);
output_raw_signal = zeros(512,640,3000);
AA_filtered = []; %% no need to prealloc I know
parfor i=1:512
for j=1:640
AA_filtered(i,j,:) = xcorr(squeeze(output_raw_signal(i,j,:)),.input_signal) %% cross correlation for each pixel in time
end
end
If I run this, I get the error "The variable in a parfor cannot be classified"
But what is a possible solution?
Greetings.
Luca
  1 commentaire
Luca Pecoriello
Luca Pecoriello le 10 Déc 2019
Hi. You are absolutely right about the third dimension of the output tensor. I have corrected it now.
why do you think the syntax does not work? what error are you getting?
I am getting "variable in a The variable in a parfor cannot be classified". Which should be expected since in a parfor with a nested for loop, the variables running one loop should not communicate with the other ones. They should be independent.

Connectez-vous pour commenter.

Réponse acceptée

Ridwan Alam
Ridwan Alam le 10 Déc 2019
Modifié(e) : Ridwan Alam le 11 Déc 2019
I am not sure how much this would help, as I couldn't reproduce your error. Please let me know how it goes.
input_signal = zeros(1,3000);
output_raw_signal = zeros(512,640,3000);
AA_filtered = cell(512,1);
parfor i=1:512
tempvar = [];
for j=1:640
newvar = xcorr(squeeze(output_raw_signal(i,j,:)),input_signal);
newvar = reshape(newvar,1,[]);
tempvar = [tempvar;newvar];
end
AA_filtered{i} = tempvar;
end
even this ran fine:
input_signal = zeros(1,3000);
output_raw_signal = zeros(512,640,3000);
AA_filtered = [];
parfor i=1:512
tempvar = [];
for j=1:640
newvar = xcorr(squeeze(output_raw_signal(i,j,:)),input_signal);
newvar = reshape(newvar,1,[]);
tempvar = [tempvar;newvar];
end
AA_filtered(i,:,:) = tempvar;
end
  7 commentaires
Walter Roberson
Walter Roberson le 11 Déc 2019
However: when there is an object transferred whose class is not known to the workers, it appears as a struct.
Luca Pecoriello
Luca Pecoriello le 11 Déc 2019

Connectez-vous pour commenter.

Plus de réponses (1)

Walter Roberson
Walter Roberson le 11 Déc 2019
Modifié(e) : Walter Roberson le 11 Déc 2019
%% mock data
input_signal = zeros(1,3000);
output_raw_signal = zeros(512,640,3000);
AA_filtered = []; %% no need to prealloc I know
parfor i=1:512
output_raw_signal_i = output_raw_signal(i,:,:);
for j=1:640
AA_filtered_i(j,:) = xcorr(output_raw_signal_i(j,:).', input_signal) %% cross correlation for each pixel in time
end
AA_filtered(i, :, :) = AA_filtered_i;
end
  2 commentaires
Luca Pecoriello
Luca Pecoriello le 11 Déc 2019
Hi
This option gives me the following error in the workspace.
Error: The variable AA_filtered in a parfor cannot be classified. See Parallel for Loops in MATLAB, "Overview".
Walter Roberson
Walter Roberson le 11 Déc 2019
Try removing the initial assignment to AA_filtered

Connectez-vous pour commenter.

Community Treasure Hunt

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

Start Hunting!

Translated by