如何在 Matlab parfor 循环中对矩阵进行分类?

How to classify a matrix within a Matlab parfor loop?

我想对矩阵的值进行分类。以下示例在 parfor 循环之外工作,但在 parfor 循环内使用时不起作用。按照提供的示例,在 parfor 循环中,我有哪些选项可以对矩阵进行分类?

% 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;

结果如下(parfor 循环外):

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

您可以使用另一个矩阵来存储结果。

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;

因此您可以以某种方式使用 parfor 循环。由于 parfor 不关心执行顺序。您的代码在 parfor 循环中不起作用,因为现在您正在修改 Imag1 的值,然后再次比较这些值,也就是任何循环迭代都将取决于先前的循环迭代

这是另一种方法:

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

现在你可以随意拆分了;按行、按列、按块、按交替列...

编辑: 不幸的是,这将 150 的值分类为 2。所以你可能不应该使用这个。


取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