Parfor loop classification "fix usage of indicated variable" error
Mostra commenti meno recenti
I'm running a parfor loop and I'm trying to output an array with the columns representing each parfor iteration, and the row elements are converted to a non-zero value at specific locations for each column index. The non-zero element row index is different for every iteration.
The problem: Unable to classify the variable 'Binarizing_Rowsum' in the body of the parfor-loop. For more information, see Parallel for Loops in MATLAB, "Solve Variable Classification Issues in parfor-Loops".
I tried to understand how to fix it by readig the documentation and other answers on the forum but I'm lost. I understand it is considered a sliced variable, however, I don't know how to fix the representation of the variable so that it matchs parfor requirements to get the output I want.
P.S. the correspoding for-loop worked perfectly
Here is the code:
jValues=1:2:length(baseFileNames)-1;
Binarizing_Rowsum=zeros(6100,length(jValues));
LEDdurIndx=NaN(1000,length(jValues));
Light=3000;
parfor idx=1:numel(jValues)
j=jValues(idx);
%Read files
fullFileName=fullfile(thisFolder, baseFileNames{j});
C_data_Array(:,:,idx)= imread(fullFileName,2);
C_data_ArrayMean(:,:,idx)=mean(C_data_Array(:,:,idx),2);
C_data_ArrayStd(:,:,idx)=std(C_data_ArrayMean(:,:,idx));
LEDdetectThresh=(mean(C_data_ArrayMean(:,:,idx),1))+C_data_ArrayStd(:,:,idx);
LEDdurIndx=find(C_data_ArrayMean(:,:,idx)>LEDdetectThresh);
LED_duration_=LEDdurIndx([1,end]); %Updated
LEDinit(idx)=LED_duration(1);%Updated
LEDend(idx)=LED_duration(2);%Updated
Binarizing_Rowsum([LEDdurIndx],idx)=Light; %OUTPUT ERROR: cannot be classified
end
Risposte (3)
Walter Roberson
il 17 Ago 2022
BR = Binarizing_Rowsum(:,idx);
BR(LEDdurIdx) = Light;
Binarizing_Rowsum(:, idx) = BR;
5 Commenti
Lina Koronfel
il 18 Ago 2022
Walter Roberson
il 18 Ago 2022
Please post your current code. You posted updated code, but you are still using Binarizing_Rowsum([LEDdurIndx],idx)=Light which would continue to generate the error message, and since you say you are not longer getting the error message then the implication is that you are not using that code
Lina Koronfel
il 19 Ago 2022
Edric Ellis
il 19 Ago 2022
Inside your loop, you are assigning a whole new value to LEDdurIndx. This makes the variable a parfor "temporary", and so any value assigned inside the loop is discarded. I don't see any such problem for Binarizing_Rowsum though...
Lina Koronfel
il 22 Ago 2022
Modificato: Lina Koronfel
il 22 Ago 2022
Bruno Luong
il 19 Ago 2022
Modificato: Bruno Luong
il 19 Ago 2022
LEDdetectThresh=(mean(C_data_ArrayMean(:,:,idx),1))+C_data_ArrayStd(:,:,idx);
LEDdurIndx=find(C_data_ArrayMean(:,:,idx)>LEDdetectThresh)
I suspect the code is buggy, the mean can never be bigger than mean + std
LEDdurIndx is therefore empty.
1 Commento
Lina Koronfel
il 22 Ago 2022
Modificato: Lina Koronfel
il 22 Ago 2022
Bruno Luong
il 22 Ago 2022
Modificato: Bruno Luong
il 22 Ago 2022
Your code is good to be called "spagetti". If all the image have the same size, you must tell parfor what they are:
jValues=1:2:length(baseFileNames)-1;
n = numel(jValues);
Binarizing_Rowsum=zeros(6100,n);
LEDdurIndx=NaN(1000,n);
Light=3000;
j=jValues(1);
%Read first file to figure out the array sizes
fullFileName=fullfile(thisFolder, baseFileNames{j});
I1= imread(fullFileName,2);
[p,q]=size(I1);
C_data_Array = zeros(p,q,n);
C_data_ArrayMean = zeros(p,1,n);
C_data_ArrayStd = zeros(1,q,n);
LEDdetectThresh = zeros(1,q,n);
Binarizing_Rowsum = zeros(p*q,n);
parfor idx=1:n
j=jValues(idx);
%Read files
fullFileName=fullfile(thisFolder, baseFileNames{j});
C_data_Array(:,:,idx)= imread(fullFileName,2);
C_data_ArrayMean(:,:,idx)=mean(C_data_Array(:,:,idx),2);
C_data_ArrayStd(:,:,idx)=std(C_data_ArrayMean(:,:,idx));
LEDdetectThresh=(mean(C_data_ArrayMean(:,:,idx),1))+C_data_ArrayStd(:,:,idx);
LEDdurIndx = find(C_data_ArrayMean(:,:,idx)>LEDdetectThresh);
LED_duration_=LEDdurIndx([1,end]); %Updated
LEDinit(idx)=LED_duration(1);%Updated
LEDend(idx)=LED_duration(2);%Updated
Temp = zeros(p*q,1);
Temp(LEDdurIndx) = Light;
Binarizing_Rowsum(:,idx)=Temp;
end
Categorie
Scopri di più su Loops and Conditional Statements in Centro assistenza e File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!