如何在 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
我想对矩阵的值进行分类。以下示例在 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