Parfor loop classification "fix usage of indicated variable" error

조회 수: 5 (최근 30일)
Lina Koronfel
Lina Koronfel 2022년 8월 17일
편집: Bruno Luong 2022년 8월 22일
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

답변 (3개)

Walter Roberson
Walter Roberson 2022년 8월 17일
BR = Binarizing_Rowsum(:,idx);
BR(LEDdurIdx) = Light;
Binarizing_Rowsum(:, idx) = BR;
  댓글 수: 5
Edric Ellis
Edric Ellis 2022년 8월 19일
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
Lina Koronfel 2022년 8월 22일
편집: Lina Koronfel 2022년 8월 22일
@Edric EllisThank you for the comment. Can you help me understand then how do I assign this temporary value of LEDduration to an array?
In this case I'm assigning the value from the temporary LEDdurIndx to LED_duration, and then I'm allocating that to both LEDinit(idx) and LEDend(idx) which I want to output outside the loop. But I don't get the output I expect. What is the most proper way to allocate the value LED_duration and LEDdurIdx outside of the parfor loop?

댓글을 달려면 로그인하십시오.


Bruno Luong
Bruno Luong 2022년 8월 19일
편집: Bruno Luong 2022년 8월 19일
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
Lina Koronfel
Lina Koronfel 2022년 8월 22일
편집: Lina Koronfel 2022년 8월 22일
Thanks for the comment. The mean in the second line is in the second dimension, however the one in the first line is in the first dimension. It shouldn't be a problem, the code is working perfectly in regular for-loop, but now I'm trying to convert it to parfor loop and that s why I'm facing these problems.

댓글을 달려면 로그인하십시오.


Bruno Luong
Bruno Luong 2022년 8월 22일
편집: Bruno Luong 2022년 8월 22일
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

카테고리

Help CenterFile Exchange에서 Loops and Conditional Statements에 대해 자세히 알아보기

제품


릴리스

R2020b

Community Treasure Hunt

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

Start Hunting!

Translated by