How to classify a matrix within a Matlab parfor lo

2019-09-08 19:22发布

问题:

I am looking to classify the values of a matrix. The following example works outside of a parfor loop, however it does not work when used within a parfor loop. What are my options to classify matrices, following the provided example, within a parfor loop?

% Sample data
Imag1 = [ 62  41 169 118 210;
         133 158  96 149 110;
         211 200  84 194  29;
         209  16  15 146  28;
          95 144  13 249 170];

% Perform the classification
Imag1(find(Imag1 <= 130)) = 4;
Imag1(find(Imag1 >= 150)) = 1;
Imag1(find(Imag1 >  140)) = 2;
Imag1(find(Imag1 >  130)) = 3;

Results in the following (outside parfor loop):

Imag1 =

    62    41   169   118   210
   133   158    96   149   110
   211   200    84   194    29
   209    16    15   146    28
    95   144    13   249   170

Imag1 =

   4   4   1   4   1
   3   1   4   2   4
   1   1   4   1   4
   1   4   4   2   4
   4   2   4   1   1

回答1:

You can use another matrix to store the result.

Imag2 = zeros(size(Imag1));

% Perform the classification
Imag2(find(Imag1 <= 130)) = 4;
Imag2(find(Imag1 >= 150)) = 1;
Imag2(find(Imag1 >  140)) = 2;
Imag2(find(Imag1 >  130)) = 3;

so you can use a parfor loop somehow. Since parfor doesn't care about order of execution. Your code doesn't work in a parfor loop because right now you are modifying the values of Imag1, then comparing those values again, aka any loop iteration would be be dependent on the prior loop iterations



回答2:

Here's another approach:

parfor c = 1:size(Imag1,2)
   Imag2(:,c) = 4-min(ceil(max((Imag1(:,c) - 130),0)/10),3);
end

Now you can split it up however you like; by rows, by columns, by blocks, by alternate columns...

Edit: Unfortunately this classifies a value of 150 as 2. So you probably shouldn't use this one.


Take 3

class = [150 141 131 0]; %// minimum values for class 1, 2, 3, 4
[m, n] = size(Imag1);
parfor c=1:n
   for r=1:m
      Imag3(r,c) = find(Imag1(r,c) >= class, 1);
   end
end